개발/코딩테스트

[프로그래머스 | JavaScript] 저주의 숫자 3

prpn97 2023. 4. 12. 23:33

<문제 설명>

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 함수를 완성해주세요.

<입출력 예>

1<=n<=100

n result
15 25
40 76

<문제 풀이>

function solution(n) {
 let Arr = [];
let count = 0;
let i = 1;
while (count < n) {
    if (i % 3 === 0 || i % 10 === 3 ||Math.floor(i/10)===3||Math.floor(i/10)===13) {
        i++;
        continue;
    }

    Arr.push(i);
    count++;
    i++;
}
 return(Arr.pop())
}

1부터 숫자가 커지면서 3이 포함된 숫자 혹은 3의배수가 되면 1을 더한 숫자로 반환해야 한다. 

3,6,9,12... 등 3의 배수에도 1을 더해야 하고, 

13,23,31,32... 등 3이 들어간 숫자에 1을 더해야 한다. 

배열 Arr에는 1부터 n까지의 숫자를 검사하며

3으로 나눴을 때 나머지가 0인 즉, 3의 배수, ex)3,6,9...

10으로 나눴을 때 나머지가 3인 즉, 1의 자리가 3인 수, ex)13,23...

10으로 나눴을 때 소숫점 떼고 몫이 3이 되는 수 ex)31,32...

 

여기서 시간이 오래 걸렸다. 

10으로 나눴을 때 소숫점 떼고 몫이 13이 되는 수를 구했다. ex) 130,131,132...

왜냐하면, n의 값은 1~100이지만, i의 값은 그렇지 않다. 

i의 값은 기존 1~n에서 규칙에 맞게 1씩 늘어나고, 늘어난 상태에서 다시 한번 처음부터

i의 값을 확인하며 규칙에 맞게 1씩 늘어난다. 

 

다시 처음부터 확인하지 않으면 규칙에 맞는 수에서 1씩 더하면 끝이지만, 

예를 들어 32에서 1을 더해서 33이 나오면 33 또한 규칙에 포함되는 수이기 때문에

1~n에서 규칙에 해당하는 수에 1을 더해서 결과값에서 계속해서 1부터 반복하며

3의 배수나 3이 포함되는 수는 1을 더해준다. 

 

그래서 해당되는 수가 100을 넘겨서 130대에 진입하게 될 경우

3이 포함되기 때문에 그 수에도 1을 더해주어야 한다. 

 

count에는 더한 수를 저장할 때마다 1씩 늘어난다.

n이 40이라고 할 때, 배열에는 1,2,4,5,7.. 점차 늘어난 수가 담기고, 

담길 때마다 count를 늘려주며 늘려준 수가 n에 도달할 때 변한 n의 값이 되므로,

그 때 담긴 배열의 가장 마지막 값을 반환한다. 

 

<코멘트>

문제를 풀 때보다 위에 설명하는 과정이 더 이상하고 어려운 것 같다. 

3의 배수를 카운트하고, includes를 써서

3이 포함되는 수를 또 카운트하면 금방 끝나는 것을 지금은 아는데,

이 문제를 공부한지 지금보다도 더 얼마 안되었을 때 풀었다보니 조건을 하나하나 달아준 것 같다. 

 

다른 사람의 풀이를 확인해보니 지금 떠올린대로 푼 식이 있었다. 

function solution(n) {
    var answer = 0;
    for(let i=1; i<=n; i++){
        if(i%3 == 0){
            n++;
        }
        if(String(i).includes("3")&& i%3 != 0){
            n++
        }
    }
    return n;
}

머릿속에 이게 바로 먼저 떠오른 것 보니, 조금은 성장한 것 같아 뿌듯하다 ^~^

728x90