문제 링크
풀이
- 수의 범위가 크기 않아서 반복문 사용한 단순 구현으로 풀어보았다.
파이썬은 2진법, 8진법, 16진법은 bin(), oct(), hex() 라는 내장 함수를 사용할 수 있지만 나머지 진법은 직접 구현해줘야했다.
# 진법에 맞는 숫자로 변환해주는 함수
def cal(n, q):
rev_base = ''
while n > 0 :
n, mod = divmod(n,q)
# 10-15를 문자로 표현하기 위해
if mod >= 10 :
# 'A'의 아스키 코드 65
rev_base += chr(55+mod)
else:
rev_base += str(mod)
index = 0
# 앞에 0 제거하기 위해 뒤에서부터 0이 아닌 숫자 등장 인덱스 저장
for i in range(len(rev_base)-1, -1, -1):
if rev_base[i] != '0':
index = i
break
return rev_base[index::-1]
def solution(n, t, m, p):
answer = ''
# 현재 순서
seq = 1
# 10진수 숫자
num = 0
# 구한 횟수
cnt = 0
while True :
# 0 이면 진법 바꿀 필요 x
if num == 0:
if seq == p :
answer += '0'
# 구한 횟수 +1
cnt += 1
if cnt == t :
return answer
# 순서 + 1
seq += 1
else :
# 진법 변환
c_num = cal(num, n)
# 변환한 숫자의 길이만큼
for i in range(len(c_num)):
# 순서 갱신
if seq > m :
seq = 1
# 튜브 차례
if seq == p:
answer += c_num[i]
# 구한 횟수 + 1
cnt += 1
if cnt == t :
return answer
#순서 + 1
seq += 1
# 10진수 숫자 증가
num += 1
다른 사람의 코드를 참고하니 재귀 함수를 사용하여 10진수를 n진수로 변환하는 함수로 코드를 훨씬 간단히 할 수 있었다.
0부터 목표하는 숫자까지 n진법으로 변환해서 저장해 놓고 튜브의 순서에 해당하는 인덱스 값의 원소를 구해주었다.
# 재귀함수로 10진수 n진수로 변환
def convert(n, base):
arr= '0123456789ABCDEF'
# n을 base로 나눈 몫과 나머지
q, r = divmod(n, base)
if q == 0:
return arr[r]
else:
return convert(q,base) + arr[r]
def solution(n, t, m, p):
answer = ''
# 숫자 리스트
num = ''
for i in range(m*t):
num += str(convert(i,n))
while len(answer)< t :
# 해당 인덱스 값만 가져오기
answer += num[p-1]
p += m
return answer
'개발 > algorithm' 카테고리의 다른 글
[프로그래머스][level2] k진수에서 소수 개수 구하기 - python (0) | 2022.04.27 |
---|---|
[프로그래머스][level2] [3차] 파일명 정렬 - python (0) | 2022.04.27 |
[프로그래머스][level2] 2개 이하로 다른 비트 - python (0) | 2022.04.27 |
[백준 6497번] 전력난 - python / 크루스칼 알고리즘 (0) | 2022.04.26 |
[백준 1647번] 도시 분할 계획- python / 크루스칼 알고리즘 (0) | 2022.04.26 |