JellyApple 2024. 3. 30. 00:12

기본부터 다시 시작하자는 마음으로 퇴근하고 기본 문제라도 하루 1~2문제는 풀자고 마음 먹었다. 하반기때는 부디 코테로 발목 잡히지 않기 위해 열심히 해야겠다..! 

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

 

2745번: 진법 변환

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

www.acmicpc.net

 

1. 풀이 

진법 변환에 대해 생소해서 규칙을 찾는데 애를 좀 먹었다.

ex) 2진법 -> 10진법 

    11111 -> 2**4 + 2**3 + 2**2 + 2**1 + 2**0 = 31 

    왼쪽 수 부터 갯수만큼 진법으로 바꾸고자 하는 수의 거듭제곱으로 곱해주면 끝이다.

   ZZZZZ ->36 ** 4 + 36 ** 3 + 36 ** 2 + 36 ** 1 + 36 ** 0 

    

1) N, B 로 숫자와 진법을 받아온다. 숫자가 아닐수도 있기 때문에 ( ex) ZZZZZ )  input().split()으로 가져와야 한다.

2) N 을 왼쪽 부터 봐야 하기 때문에 인덱스 순서를 바꿔준다.  N == [ N :: -1] 

3) enumerate 를 통해 인덱스를 붙여주고 그 인덱스 갯수만큼 거듭제곱 해준다.

 

2. 정답 코드

N,B = input().split()
nums_list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
N = N[::-1]
B = int(B)
ans = 0 
for i , num in enumerate(N):
    ans += (nums_list.index(num) * (B**i))
print(ans)

 

 

3. 배운 점 

 1) 문자열 다루기 : 파이썬은 문자열 다룰 때 많은 기능을 제공한다. 이 문제에서는 왼쪽 부터 수를 계산해줘야 했기 때문에 순서를 거꾸로 출력하는 것이 좋다 생각했고 그래서 N = N[::-1] 을 통해 거꾸로 출력 해줬다. 

만약 [3:0:-1] 이라고 쓰면 

3번 인덱스부터 1번 인덱스까지 역순으로 출력해 준다. 

 [3::-1]  : 3번 인덱스부터 0번 인덱스까지 역순으로 출력해 준다. 즉 [S:E-1:-1] Start 부터 End-1 까지 역순으로 출력해준단 뜻이다. 

 2) enumerate : 인덱스와 원소를 동시에 접근하면서 루프를 돌릴 수 있게 도와주는 파이썬 내장 함수이다.

for fruit in enumerate(['Apple' , 'Banana' , 'Orange']):
    print(fruit) 
 
 (0,Apple)
 (1,Banana)
 (2,Orange)

 

위 예시를 보면 알 수 있듯이 인덱스와 원소로 이루어진 Tuple을 만들어준다. 그래서 인덱스와 원소를 각각 다른 변수로 할당하고 싶을 땐 인자 풀기를 진행해줘야 한다. 

>>> for i, fruit in enumerate(['Apple', 'Banana', 'Orange']):
...     print(i, fruit)
...
0 Apple
1 Banana
2 Orange

 

또한 시작 인덱스를 변경 해줄 수 있다 start 인자에 내가 원하는 숫자를 넣어주면 된다. 

>>> for i, fruit in enumerate(['Apple', 'Banana', 'Orange'], start=1):
...     print(i, fruit)
...
1 Apple
2 Banana
3 Orange