[BOJ] 11005: 진법 변환 2

이슬비·2022년 6월 18일
0

Algorithm

목록 보기
47/110
post-thumbnail

뭔가 느낌이 좋다...!

11005: 진법 변환 2

1. 내 풀이 1: 실패

import sys

N, B = map(int, sys.stdin.readline().strip().split())
answer = ''
toAlpha = {'10': 'A', '11': 'B', '12':'C', '13':'D', '14':'E', '15':'F', '16':'G', '17':'H', '18':'I', '19':'J', '20':'K', '21':'L', '22':'M', '23':'N', '24':'O', '25':'P', '26':'Q', '27':'R', '28':'S', '29':'T', '30':'U', '31':'V', '32':'W', '33':'X', '34':'Y', '35':'Z'}

while N != 0:
    answer += str(N%B) + '/'
    N = N//B
answer = answer.split('/')

for i in range(len(answer)):
    for j in toAlpha:
        if answer[i] == j:
            answer[i] = toAlpha[j]
print(''.join(answer).replace(' ', ''))

바보 같은 풀이 ... ^^
나누기를 해줬으면 반대로 나머지가 저장되니까 reverse를 해줘야 하는데 해주지 않았다 ㅎㅎ

2. 내 풀이 2: 성공

import sys

N, B = map(int, sys.stdin.readline().strip().split())
answer = ''
toAlpha = {'10': 'A', '11': 'B', '12':'C', '13':'D', '14':'E', '15':'F', '16':'G', '17':'H', '18':'I', '19':'J', '20':'K', '21':'L', '22':'M', '23':'N', '24':'O', '25':'P', '26':'Q', '27':'R', '28':'S', '29':'T', '30':'U', '31':'V', '32':'W', '33':'X', '34':'Y', '35':'Z'}

while N != 0:
    answer += str(N%B) + '/'
    N = N//B
answer = answer.split('/')

for i in range(len(answer)):
    for j in toAlpha:
        if answer[i] == j:
            answer[i] = toAlpha[j]
answer.reverse()
print(''.join(answer).replace(' ', ''))

그래서 reverse 한 줄을 추가했다. 결과는,

성공 ~!

일단 메인 아이디어는

10진법에서 n진법으로 바꾸는 방법
: (10진법 수) / n
➡️ 이때 나머지는 진법을 표현하는데 사용되고, 몫은 계속해서 n으로 나눠지게 됨

while N != 0:
    answer += str(N%B) + '/'
    N = N//B
answer = answer.split('/')	

이 부분이 바로 그 부분이다. 여기서 포인트는 나머지를 먼저 추가하고 나눠야 한다는 것! 그런데 이때 나머지가 9보다 클 수 있기 때문에, 이를 A~Z의 알파벳으로 나타내주게 되는 것이다. 그래서 초반에 dictionary를 이용해 나타내주었다.

for i in range(len(answer)):
    for j in toAlpha:
        if answer[i] == j:
            answer[i] = toAlpha[j]
answer.reverse()
print(''.join(answer).replace(' ', ''))

그리고 for문을 이용해 비교하면서 해당 숫자(정확히는 문자열)를 알파벳으로 바꿔주는 것이다.

3. 다른 풀이

전체적인 로직은 비슷하긴 한데, dictionary를 사용하지 않은 부분이 달라 한 번 들고 와봤다. 출처는 아래의 링크.
https://duwjdtn11.tistory.com/486

import sys

temp = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
N, B = map(int, sys.stdin.readline().strip().split())
answer = ''

while N != 0:
    answer += str(temp[N%B])
    N = N//B

print(answer[::-1])

해당 인덱스로 알파벳 찾기... 똑똑하다 똑똑해... 그리고 문자열 뒤집는 건 reverse 말고 [::-1]가 있다는 걸 기억해두자!!!

profile
정말 알아?

0개의 댓글