
문제
https://school.programmers.co.kr/learn/courses/30/lessons/17687
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
문제를 풀기 위해서는 진법 변환에 대한 기초 지식이 있어야한다.
간단한 예로 로직을 살펴보면 7을 2진수로 나타내보자.
7 / 2 = 3 ... 1
3 / 2 = 1 ... 1
1 / 2 = 0 ... 1
0 / 2 = 0 ... 0
(... 은 나머지를 나타낸다.)
10진수 7을 2진수로 나타내면 1110 이다. n진수로 나타내고 싶을때, 나머지들을 취하면 해당 진법으로 변환시킬 수 있다.
단 위처럼 코드를 짜면 1110이 저장되는게 아니라 0111이 저장되니 뒤집어준 다음, 값들을 활용하면 된다.
11진수부터는 두자리수가 나오는데 이는 A .. F 로 매핑해서 변환시켜주면 된다.
필요한 값들을 위 로직에 따라 만들어놓고, 이후에는 주어진 순서에 맞게 값들을 가져오면 풀 수 있다.
코드
def solution(n, t, m, p):
d = { '10':'A', '11':'B', '12':'C', '13':'D', '14':'E', '15':'F'}
ans = ''
vals = []
for i in range(m * t):
ti = i
temp = []
if ti == 0:
temp += '0'
while ti!=0:
val = str(ti%n)
if val in d:
temp += d[val]
else:
temp += val
ti //= n
temp.reverse()
vals.append(temp)
order = 1
count = 0
for i in range(len(vals)):
for j in range(len(vals[i])):
if order == p:
ans += str(vals[i][j])
count += 1
if order == m:
order = 1
else:
order += 1
if count == t: return ans
return ans
후기
처음에 문제를 잘못이해했다. 10 인 경우에 1 , 0 순서로 가져오는건데 그냥 앞자리만 가져오는 줄 알았다.
덕분에 시간이 한참걸렸다, 문제를 꼼꼼히 읽는 습관을 들이자. ㅠㅠ
그리고 다른 풀이를 보다 알았는데 몫과 나머지 모두 한 번에 구하는 divmod 라는 내장 메소드가 있더라. 다음에 활용해 봐야겠다.
'프로그래머스' 카테고리의 다른 글
LV2 [KAKAO] k진수에서 소수 개수 구하기 (0) | 2023.06.20 |
---|---|
LV2 [KAKAO] 후보키 (0) | 2023.06.11 |
LV2 [KAKAO] 순위 검색 (0) | 2023.06.05 |
LV2 [KAKAO] 양궁대회 (0) | 2023.06.01 |
LV2 [KAKAO] 이모티콘 할인행사 (0) | 2023.05.29 |