알고리즘/Python

[백준/python] 11005번 : 진법 변환 2

_SIHA_ 2022. 2. 8. 16:52

📖  문제 링크

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

 

11005번: 진법 변환 2

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

www.acmicpc.net

 

👩‍💻  문제풀이

 

맞긴 맞았는데, 속도가 느려서(140ms가 나옴) 다시 풀어본 문제이다.

비슷한 풀이라고 생각했는데, 다른 풀이와 속도가 2배 정도 차이가 난다.

 

처음 코드는 알파벳 대문자를 리스트로 먼저 만든 후 진행했다. (ascii_uppercase 사용)

다른 분들의 풀이를 보니 리스트로 만들지 않고, 나머지를 구함과 동시에 아스키코드로 계산해 바로 배열에 넣어주었다.

이렇게 진행했더니 바로 72ms라는 속도로 줄어들었다. 

 

원인은 사실 잘 모르겠다.

배열을 탐색하는 과정에서 속도가 느려지는 건지, 아니면 ascii_upper케이스의 자체 속도가 있는 건지 아직 발견하지 못했다.

다음에 비슷한 문제를 풀땐 아스키코드를 직접 계산하는 방식을 주로 써봐야겠다. 

 

 

  최종 코드

#<속도가 느린 코드> 
from string import ascii_uppercase


alphabet = list(ascii_uppercase)

N, B = map(int, input().split())
arr=[]
while N!=0:
    if N%B >= 10:
        arr.append(alphabet[(N%B)-10])
    else:
        arr.append(N%B)        
    N = N//B
    

for i in reversed(arr):
    print(i, end='')
# <속도 향상을 위해 다시 푼 문제> 

N, B = map(int, input().split())
arr=[]
while N!=0:
    if N%B >= 10:
        arr.append(chr(65 + (N%B) - 10))
    else:
        arr.append(N%B)        
    N = N//B
    

for i in reversed(arr):
    print(i, end='')