출처: 프로그래머스 코딩 테스트 연습, [프로그래머스] [3차] n진수 게임
1. 파이썬으로 문자를 아스키코드로 아스키코드를 문자로 바꾸는 메서드
chr(아스키코드) # 아스키코드를 문자로 ord(문자) # 문자를 아스키코드로
2. 몫과 나머지를 반환값으로 갖는 메서드
몫, 나머지 = divmod(값, 나누는 값) 몫 = 값 // 나누는 값 나머지 = 값 % 나누는 값
효율성검사를 하지 않는 문제로 있는 그대로 풀었다.
1. 숫자를 문자로 바꾸는 메서드와 이 메서드 안에서 사용되는 n진수를 알파벳으로 바꾸는 메서드를 만들어 준비한다.
2. 튜브가 t만큼의 숫자를 구할때까지 무한 반복문을 돈다. 튜브의 순서가 1부터 시작하여 -1을 하여 턴에서 참가인원수인 m만큼 나눈 나머지를 사용할 수 있도록 했다.
def solution(n, t, m, p):
"""
진법 = n
미리 구할 숫자 = t
참가 인원 = m
튜브의 순서 = p
"""
answer = ''
def to_N(num):
return chr(ord('A') + num - 10) if num < 16 and num >= 10 else str(num)
def num_to_str(num):
q, r = divmod(num, n) # 몫과 나머지 한번에 계산 메서드
ret = to_N(r)
while q > 0:
q, r = divmod(q, n)
ret = to_N(r) + ret
return ret
print(num_to_str(17))
num, turn = 0, 1
while t > 0:
# print(num_to_str(num), end='')
for v in num_to_str(num):
if turn % m == p:
t -= 1
answer += v
if t == 0: break
turn += 1
num += 1
return answer
n진수를 표현하는 방법으로 나는 인터넷으로 아스키코드 변환 메서드를 검색하면서 풀었지만 다른 사람 풀이에서는 1부터 16까지를 리스트로 만들어 여기에 알파벳을 넣어 아스키코드를 변환하지 않고 풀었다. 만약 n진수가 16까지 정해지지 않고 그 이상이였다면 나처럼해야겠지만 문제를 더 간단하게 풀때는 리스트로 캐싱해서 푸는 것이 더 효율적인 것 같다.