나의 코드
function solution(n) {
let counter = 0;
for (
let i = 1;
i <= n;
counter % 3 === 0 || (counter + "").split("").includes("3") ? i : i++
) {
counter++;
counter % 3 === 0 ? counter++ : null;
(counter + "").split("").includes("3") ? counter++ : null;
}
return counter;
}
for문에서 i와 counter가 함께 1씩 증가하도록 한다.
단, counter가 3의 배수이거나 '3'을 포함하는 숫자일 경우 counter를 1씩 더 증가시킨다.
이 논리로 갈 경우 i가 14일 때까지는 문제가 없지만,
i가 15가 될 경우
for문 내부 첫줄에서 counter가 23으로 증가하고
23이 3의 배수가 아니어서 24가 된 채로 빠져나오는 문제가 생긴다.
문제에 제시된 대로라면 25가 된 채로 빠져나와야 한다. (24가 3의배수이므로)
그래서 3의 배수이거나 3이 포함되는 숫자인데도 빠져나온 경우 i가 16으로 증가하지 않고 그대로 15로 남아 한 번 더 돌도록 코드를 짰다.
통과는 했지만, 불가피하게 조건식 부분이 좀 깔끔하지 못한 점은 아쉬웠다.
다른 코드
function solution(n) {
return [...Array(n * 2)]
.map((v, i) => v = i + 1)
.filter((num) => num % 3 !== 0 && !num.toString().includes("3"))[n - 1];
}
제한 사항에서 1 ≤ n ≤ 100 이라 하였으므로 넉넉한 개수의 원소를 가진 빈 배열을 우선 선언하고,
이를 인덱스+1의 값으로 채운다.
(여기서 넉넉함이라 하면, 1~n의 범위에서 기준에 맞지 않는 숫자들이 추후 필터로 걸러질 것을 감안하기 때문이다.
예를 들어 만약 빈 배열 원소가 100개인데 n=100을 찍으면 undefined가 반환된다.)
나는 n*2개 만큼의 원소 개수를 지닌 빈 배열을 선언했다.
여기서 3의 배수가 아니거나 3을 포함하지 않는 숫자들은 filter로 걸러버리면, 3x 마을 사람들의 숫자 배열이 나온다. n번째 숫자를 반환하도록 하는 것이다.(단 n-1인 것은 인덱스이기 때문)
이 코드의 장점은 원하는 숫자까지 3x마을 숫자 배열 전체를 확인할 수 있다는 것이다.