Python/online judge

백준 [2745.진법 변환] | Python

구름솜:D 2024. 1. 12. 16:13
728x90

✏️ 문제

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

 

2745번: 진법 변환

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

www.acmicpc.net

 

✏️ 풀이방법

- 257를 8진수로 변환하면 다음과 같이 계산한다.

1. 문자열 n의 문자 하나씩을 num에서 찾아 그에 해당하는 인덱스를 가져와서 담는 리스트(newn)를 생성

2. 진법으로 변환하는 제곱의 횟수가 하나씩 줄어드니까 -1씩 감소하는 for문으로 연산

 

📌 코드

n, b =  input().split()
num = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
newn = []
binary = 0
for i in range(len(n)):
    if n[i] in num:
        newn.append(num.index(n[i]))

start = len(newn)-1
for i in range(start,-1,-1):
    binary += newn[i]*(int(b)**(start-i))
print(binary)

 

 

📌 결과

#입력
ZZZZZ 36

#출력
60466175

 

 

🤔 시행착오.1

n, b =  input().split()
num = [0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
for i in range(len(n)):
    if n[i] in num:
        n[i] = num.index(n[i])
print(n)
TypeError: 'str' object does not support item assignment

- 이 오류는 문자열 객체에 항목 할당이 지원되지 않는다는 에러

- 파이썬에서는 문자열은 불변(immutable)한 데이터 타입이기 때문에 일단 생성되면 변경할 수 없는데 반복문안에 조건문에서 값을 변경하려고 했기 때문에 문자열의 특정 인덱스에 값을 할당하려고 해서 발생한 에러

 

🤔 시행착오.2

n, b =  input().split()
num = [0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
newn = []
binary = 0
for i in range(len(n)):
    if n[i] in num:
        newn.append(num.index(n[i]))

start = len(newn)-1
for i in range(start,-1,-1):
    binary += newn[i]*(int(b)**(start-i))
print(binary)

- num리스트에 숫자형이랑 문자열이 함께 들어가 있어서 연산이 불가능

 

 

 

🔎 다른풀이

N, b = input().split()
ary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

N = N[::-1]
result = 0

for i,n in enumerate(N):
    result += (int(b)**i)*(ary.index(n))
print(result)

-https://velog.io/@yje876

 

 

📝 메모

- enumerate에 대해 공부하기