문제설명
3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.
정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 100
풀이
하나씩 올려가면서, 3이라는 문자가 포함되거나, 3의 배수인 경우 1을 더해주는 방식으로 하면 될 것 같다.
그러니까 1 - 2 - 4(3 + 1) - 5 - 7(6 + 1) - 8 - 10(9+1) - 11 - 14(13+1 - 12+1) - 15 - ...
여기서 1이 올라간 숫자에 3이 포함되거나 3의 배수인 경우까지 생각했을땐,
while 문으로 해당 조건에 부합하지 않을때까지 +1을 해주고 넘겨주면 될꺼같다.
const solution = (n) => {
let count = 1;
for(let i = 1; i < n; i ++){
count += 1;
while(count % 3 === 0 || String(count).split("").includes("3")){
count += 1;
}
}
return count;
}
for문 내에 while 문이 있으므로 해당 while문이 종료될때 까지 for문의 한블럭이 종료되지 않아
n번째에 해당하는 숫자를 구할 수 있다.
reduce()로 풀 수 있지 않을까?
const solution = (n) =>
new Array(n).fill("").reduce((acc, cur) => {
acc += 1;
while(acc % 3 === 0 || String(acc).split("").includes("3")) acc += 1;
return acc;
}, 0);
""로 채워진 n개의 배열을 만들어주고, reduce로 count 대신 acc를 누적시켜가면서 돌렸더니 이렇게도 가능했다.