https://school.programmers.co.kr/learn/courses/30/lessons/17687
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
* 내 풀이:
# 10진수 -> n진수 변환 함수
def change(num, n):
if num == 0:
return '0'
ans, table = '', {'10':'A', '11':'B', '12':'C', '13':'D', '14':'E', '15':'F'}
while num:
num, rem = divmod(num, n)
if rem > 9:
rem = table[str(rem)]
ans += str(rem)
return ans[::-1]
def solution(n, t, m, p):
temp, cnt = [], 0
# m명이 말할 숫자들 추출 (총 (t * m)개)
for i in range(t * m):
num = change(i, n)
if len(num) + cnt > t * m:
break
temp += list(num)
cnt += len(num)
temp += num[:t * m - cnt]
# 튜브가 말할 숫자들
ans = ''
for i in range(t):
ans += temp[(p - 1) + i * m]
return ans
- 아이디어: n진수로 바꿔주는 함수 만들고, 숫자가 총 t * m번 불릴 것이므로 그 길이만큼 필요한 숫자 추출, 튜브는 그 중에서 p에서 시작해 m의 주기를 가지면서 숫자를 부름
* 참고 답안:
def change(num, n):
if num == 0:
return '0'
ans, nums = '', '0123456789ABCDEF'
while num:
num, rem = divmod(num, n)
ans += nums[rem]
return ans[::-1]
def solution(n, t, m, p):
ans = ''
for num in range(t * m):
ans += change(num, n)
return ans[p-1::m][:t]
- 동일 아이디어로, 필요한 길이만큼에서 break 걸지 않고 다 생성한 후 튜브가 말할 숫자만 추출하는 경우
- 모두 생성했을때 훨씬 짧지만 느려짐을 확인
- 10 이상의 숫자 처리방식 직관적이며, for문 대신 슬라이싱으로 더 간단하게 정답 반환 가능함
* 재귀 이용 진수 변환
def change(num, n):
nums = '0123456789ABCDEF'
quo, rem = divmod(num, n)
return ('' if quo == 0 else change(quo, n)) + nums[rem]
* 개선한 코드:
def change(num, n):
if num == 0:
return '0'
ans, nums = '', '0123456789ABCDEF'
while num:
num, rem = divmod(num, n)
ans += nums[rem]
return ans[::-1]
def solution(n, t, m, p):
ans, cnt = '', 0
for i in range(t * m):
num = change(i, n)
if len(num) + cnt > t * m:
break
ans += num
cnt += len(num)
ans += num[:t * m - cnt]
return ans[p - 1::m]
'CS > algorithm & data structure' 카테고리의 다른 글
[프로그래머스] 주차 요금 계산 (파이썬 풀이) (0) | 2022.07.06 |
---|---|
[프로그래머스] k진수에서 소수 개수 구하기 (파이썬 풀이) (0) | 2022.07.06 |
[프로그래머스] [3차] 파일명 정렬 (파이썬 풀이) (0) | 2022.07.05 |
[프로그래머스] [3차] 압축 (파이썬 풀이) (0) | 2022.07.05 |
[프로그래머스] [3차] 방금그곡 (파이썬 풀이) (0) | 2022.06.30 |