[프로그래머스 | JS] Lv0. 저주의 숫자 3

HICHULOG·2023년 7월 6일
0

프로그래머스

목록 보기
4/38
post-thumbnail

저주의 숫자 3

📝 문제

3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.

10진법3x 마을에서 쓰는 숫자10진법3x 마을에서 쓰는 숫자
1168
22710
34811
45914
571016

정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.

⛔️ 제한 사항

  • 1 ≤ n ≤ 100

💡 풀이

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. 1부터 n보다 큰 숫자까지 for문을 돌리면서 빈 배열에 숫자를 넣고 3의배수이거나 3을 포함한 숫자를 거른다.
  2. 배열에서 n-1의 인덱스를 가진 요소를 반환한다.

=> 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에 _는 사용하지 않는 인수??를 나타낸다고 한다.

🚀 TIL

profile
🚀 Front-end Dev

0개의 댓글