- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/17687
Lv2 문제다!
문제이해
p에 맞춰서 만들기 보다 t * m만큼의 수를 n진법으로 바꾼다음 m으로 나눈 나머지가 p - 1인 인덱스의 값들을 출력한 뒤(p가 말하는 숫자들을 출력해야하므로) t -1까지의 수를 최종으로 출력하면 된다
1. 1부터 9까지는 정수를 넣고, 10이상인 수는 알파벳으로 바꿔서 data에 저장한다. 이제 들어온 수를 data로 이용해서 n진법으로 바꿀 것이다
2. i번째 수를 n진법으로 바꾸려면 i를 n으로 나눈 나머지에 매칭되는 수를 오른쪽으로 누적해 나간다(temp)
3. 그 값을 누적해야하므로 str_value에 누적해간다
4. str_value에서 p가 말하는 숫자들을 반복문을 통해 answer에 옮긴 후 t개만큼만 반환하면 된다
- 정답 풀이 :
def solution(n, t, m, p):
answer = ''
data = dict()
for i in range(16):
data[i] = str(i)
if i > 9:
data[i] = chr(i + 55)
for i in range(t * m):
temp = ''
if i == 0:
str_value = '0'
continue
while i > 0:
temp = data[i % n] + temp
i //= n
str_value += temp
for i in range(len(str_value)):
if i % m == p - 1:
answer += str_value[i]
return answer[:t]
- 시도해본 풀이 :
50 퍼센트에서 계속 틀렸던 풀이다
이 로직에서는 13, 16같은 10대인 수에만 적용이 된다
50을 13진법으로 표현하면 3A(11)인데, 아래 로직으로하면 30이 출력된다
def change(number, n):
mul = 0
temp = number
if n > 10 and 10 <= temp <= (n - 1):
return chr(temp + 55)
while True:
if temp // n == 0:
break
mul += 1
temp = temp // n
result = ''
for i in range(mul, -1, -1):
if number // (n ** i) != 0:
result += str(number // (n ** i))
number -= (n ** i) * (number // (n ** i))
else:
result += '0'
return result
def solution(n, t, m, p):
changed = ''
number = 0
while len(changed) < t * m :
#숫자를 n진법 수로 변환시키기
changed += change(number, n)
number += 1
changed = list(changed)
answer = ''
for i in range(len(changed)):
if i % m == p - 1:
answer += changed[i]
return answer[: t]
'코딩테스트 > 기출' 카테고리의 다른 글
[연습문제 / 프로그래머스] 12913번 : 땅따먹기 (0) | 2022.09.21 |
---|---|
[2018 KAKAO BLIND RECRUITMENT/ 프로그래머스] 17684번 : [3차] 압축 (0) | 2022.09.21 |
[dfs, bfs / 프로그래머스] 43175번 : 타겟 넘버 (0) | 2022.09.20 |
[ 2022 KAKAO BLIND RECRUITMENT / 프로그래머스] 92335번 : k진수에서 소수 개수 구하기 (0) | 2022.09.20 |
[월간 코드 챌린지 시즌3 / 프로그래머스] 87390번 : n^2 배열 자르기 (0) | 2022.09.18 |