3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.
10진법 | 3x 마을에서 쓰는 숫자 | 10진법 | 3x 마을에서 쓰는 숫자 |
---|---|---|---|
1 | 1 | 6 | 8 |
2 | 2 | 7 | 10 |
3 | 4 | 8 | 11 |
4 | 5 | 9 | 14 |
5 | 7 | 10 | 16 |
정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.
function solution(n) {
let arr = [];
for(let i=1; i<2*n; i++){
if(i.toString().includes("3") || i%3===0){
arr.push(i+1);
i += 1
}else{
arr.push(i);
}
}
console.log(arr)
}
=> 1번에서 막혔다. 3의배수와 3을 포함한 수가 연달아 있는 12,13에서 13이 배열에 들어가 버리는 사례가 생겼다. 어떻게 해결해야 할까? 연달아 있지 않으면 조건은 잘 적용된다.
function solution(n) {
let arr = [];
for(let i=1; i<3*n; i++){
if(i%3===0){
arr.push(i+1);
i += 1
}else{
arr.push(i);
}
}
let filteredArr = arr.filter(x=>!x.toString().includes("3"))
return filteredArr[n-1];
}
=> 위와 같은 식으로 테스트를 통과하였지만 효율적인 것 같지는 않다. 약간 그냥 돌아가게만 한 느낌.
function solution(n) {
let a = [];
for(let i=1; i<1000; i++){
if(!i.toString().includes("3")){
if(i%3!=0){
a.push(i);
}
}
}
return a[n-1];
}
=> 위의 풀이는 내가 푼 풀이의 간결하게 정리된 버전같다.
3을 포함하지 않는 수이면서 3의 배수가 아닌 수를 배열에 넣는다.
우와 뒤집어서 생각하면 간단한 거 였다.
function solution(n) {
let arr = [];
let num = 0;
while (arr.length !== n && ++num) if (num%3!==0 && !(''+num).includes('3')) arr.push(num);
return arr.pop();
}
=> Array.prototype.pop() 메서드는 배열에서 마지막 요소를 제거하고 그 요소를 반환.
function solution(n) {
return [...Array(n * 3)]
.map((_, i) => i + 1)
.filter((num) => num % 3 !== 0 && !num.toString().includes("3"))[n - 1];
}
=>.map((current value, index) => index+1)에서 current value에 _는 사용하지 않는 인수??를 나타낸다고 한다.