🔗 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/17687
✏️ 풀이
function solution(n, t, m, p) {
const max = m * (t - 1) + p;
const answer = [];
let numbers = '';
let value = 0;
while (numbers.length < max) {
numbers += (value++).toString(n);
}
let i = 0;
while (answer.length < t) {
if (i % m + 1 === p) {
answer.push(numbers[i]);
}
i++;
}
return answer.join('').toUpperCase();
}
규칙대로 숫자를 나열했을 때, 원하는 숫자들은 최대 m * (t - 1) + p번째 수 안에 존재한다. 따라서, 0부터 시작해서 value를 1씩 증가시키면서 value를 n진수 문자열로 바꾼 값을 길이가 m * (t - 1) + p 이상이 될 때까지 numbers에 이어붙인다.
그 다음, 튜브의 차례일 때 말해야 하는 숫자만 골라서 answer에 담는다. 그리고 나서 answer를 전부 이어붙이고 소문자를 대문자로 변환하면 정답을 구할 수 있다.
💡 제너레이터를 활용한 풀이
function solution(n, t, m, p) {
const program = (function* (n) {
let value = 0;
while (true) {
const numbers = [...value.toString(n)];
for (let i = 0; i < numbers.length; i++) {
yield numbers[i].toString().toUpperCase();
}
value++;
}
})(n);
const output = [];
let i = 0;
while (output.length < t) {
const { value } = program.next();
if ((i++ % m) === p - 1) {
output.push(value);
}
}
return output.join('');
}
제너레이터를 활용해서 지연 평가를 하면 뭔가 메모리를 아낄 수 있다는 생각이 들어서 처음에 이렇게 풀었다. 그러나 그런 효과는 전혀 없고 오히려 시간만 더 오래 걸렸다..
'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스 Level 2] 타겟 넘버 - JavaScript (0) | 2022.07.04 |
---|---|
[프로그래머스 Level 2] k진수에서 소수 개수 구하기 - JavaScript (0) | 2022.06.13 |
[프로그래머스 Level 2] 파일명 정렬 - JavaScript (0) | 2022.06.11 |
[프로그래머스 Level 2] 압축 - JavaScript (0) | 2022.06.10 |
[프로그래머스 Level 2] 방금그곡 - JavaScript (0) | 2022.06.10 |