https://www.acmicpc.net/problem/2745

 

2745번: 진법 변환

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 

www.acmicpc.net

 

 

요즘 파이썬을 공부하면서 백준 문제를 천천히 풀어나가고 있습니다.

 

먼저 문제를 이해해보도록 하겠습니다.

 

보시는 것처럼 예제로 이해해보면

첫번째 Z : 35 X 36의 4제곱 = 58,786,560

두번째 Z : 35 X 36의 3제곱 = 1,632,960

세번째 Z : 35 X 36의 2제곱 = 45,360

네번째 Z : 35 X 36의 1제곱 = 1,260

마지막 Z : 35 X 36의 0제곱, 즉 1이 곱해져서 36 입니다.

 

이 모든 숫자를 더하면?

58,786,560 +  1,632,960 + 45,360 + 1,260 + 36 = 60,466,176

 

예제 출력에 나와있는 수가 출력이 되는 것을 알 수 있습니다.

 

 

규칙성이 보이시나요?

 

그래서 저는 N 값을 딕셔너리화 시켜서 문제를 해결했습니다!

 

 

 

이 문제를 보자마자 어떻게 풀까 고민하다가 코랩에서 이렇게 풀었습니다!

# 첫번째 문제 풀이 (백준 사이트에서는 런타임에러(KeyError) 발생)

N, B = input().split() 			# 두 값 받기
B = int(B)             			# 정수형 변환
n = len(N)			        # N의 길이를 변수 n에 저장
list_N=list(N)        		       # N을 리스트로 만듦

#각 알파벳을 대입할 딕셔너리 생성 (알파벳이 key, 숫자가 value)
dic = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':18,'J':19,'K':20,'L':21,'M':22,'N':23,'O':24, 'P':25,'Q':26,'R':27,"S":28,'T':29,'U':30,'V':31,'W':32,'X':33,'Y':34,'Z':35}

sum = 0 			   # 합계를 계산할 변수 sum 

for i in list_N:      		   # 리스트로 만든 N으로 반복
  sum += int(dic[i]) * (B**(n-1))  # sum에 각 알파벳의 key 값에 B진법 계산
  n -= 1            		   # n 값을 1씩 빼줌

print(sum) 			   # 합계 출력

 

 

코랩에서는 분명 맞았단 말이죠? 정답이었습니다!

당연하죠! 틀리지 않았으니까요?

 

코랩에서 짠 코드 - 정답이었습니다!

 

그.런.데

틀렸다고 나오더라고요?

 

띠용 했어요... 뭐지? 코드 안틀렸는데?

그런데 찾아보니... 단 두 줄로 끝나는 거더라고요????

 

# 두번째 문제 풀이 (백준에서 정답 처리됨)

n, b = input().split()
print(int(n,int(b)))

어이가 없어서...

 

파이썬은 int 함수를 이용해서 n진법을 10진법으로 변환할 수 있다고 해요.

int(변환할 문자열, int(n진법)) 이렇게 쓰면 된다고 합니다.... n진법은 int형으로 써주기!

이럴 수가... 좀 약간 억울..?

 

저는 A 값에 10이 저장되어 있고 이런 것을 몰랐었습니다..

(사실 코드 짜면서 이게 맞나..? 하는 의문이 들긴 했습니다.. 딕셔너리 만들 때요...

이렇게 하나하나 알파벳을 입력해서 값을 넣어야하나 고민했습니다...)

 

좀 황당하더라고요..흐엉 (일일히 쓴 나는 뭔가...)

 

이렇게 배워가는 거겠죠ㅠ_ㅠ

 

이상으로 백준 2745번 2가지 문제 풀이 였습니다!

+ Recent posts