Algorithm JS | 프로그래머스 코딩테스트_저주의 숫자 3

앙두·2023년 6월 1일
0

Algorithm

목록 보기
11/17

📑 문제

  • 숫자가 3의 배수거나, 3이 들어가있으면 안됨
  • n은 1~100 사이의 숫자

🤓 나의 풀이

30분정도 걸렸고, +9점 획득 ⭐️

처음엔, 멍하니 생각만 했다.
3이 들어가면 안되고, 3의 배수도 안되고 ..
늘어나는 숫자에 규칙이 없어서, 어떻게 풀어야 하나 생각하다가,

어차피 제한사항이 n은 100까지 밖에 주어지지 않는다.
그렇기에 3x의 숫자도 제한적일 수 밖에 없다고 생각했다.

n은 정직하게 1 부터 100까지, 10진법 숫자(1씩 늘어나는)니까,
3x마을에서 쓸 숫자를 배열에 담아, nindex로 쓰면 되지 않을까?!
하는 생각에 도달했다.
👇🏻

function solution(n) {
    let noThree = 0;
    const noThreeArr = [];

    while (noThree <= 200) {
      ++noThree;
      (!(String(noThree).includes('3')) && noThree % 3 !== 0)
      && noThreeArr.push(noThree);
    }

    return noThreeArr[n-1];
}
  1. 3x마을에서 쓸 숫자를 관리해줄 noThree 변수를 만들었다.
  2. noThree 를 담아줄 배열을 만들었다. (noThreeArr)
  3. 대략적인 숫자 200을 잡아서, noThree 가 200이하일 동안 while 돌도록 조건 설정.
  4. while문을 도는 동안 noThree1씩 점진적으로 더해지게끔 noThree++;
  5. noThree 에 3이 포함되는지 조건 설정
    (noThree의 type은 number이므로 includes()를 사용할 수 없으니, toString()을 사용하여 문자로 바꿔주자!)
  6. noThree 가 3의 배수인지 검사해야하므로, 3으로 나눴을 시 나머지가 0인 조건 설정
  7. 5, 6번의 조건에 부합하지 않은 숫자여야하므로, 각 조건 앞에 not연산자 !를 붙여주었다.
  8. !조건2개true일 경우 noThree 숫자를 매번 noThreeArr 배열에 push 시켜라!
  9. noThreeArr 에 3x마을에서 쓰는 200이하의 숫자들만 담긴다.
  10. nnoThreeArr 배열의 index로 접근해야 하므로, -1을 해준 값을 return 해준다. (배열의 index는 0부터 시작하기 때문이다)

이렇게 풀어냈다!

그러나 문제점은, n의 숫자가 제한적이여야만 가능한 함수다 ㅜㅜ
그리고 n 숫자가 커질수록 whild 문 조건 숫자도 매번 수정해줘야 한다.


👍🏻 제일 간단한 풀이 (다른 사람들의 풀이 참고)

n의 숫자가 제한적이지 않아도, 언제나 작동할 수 있는 함수!
다른 사람이 푼 것을 그대로 가져와보았다.

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;
}

일반 for문을 쓰셨다.
i는 1이고, i가 인자n 보다 작을동안 (0이 들어올 수 없으므로 항상 작다), i에 1씩 더해가며 for문을 돌려라.
n이 어떤 숫자가 들어오냐에 따라서, for문의 횟수도 변한다.
예를 들어 n이 6일 경우,

for문은 총 6번 돌게되고 👇🏻

i가 1일 땐 두 조건에 노부합 n = 6
i가 2일 때에도 두 조건에 노부합 n = 6
i가 3일 땐 첫번째 조건에 부합 n = 7, 두번째 조건에 노부합 n = 7
i가 4일 땐 두 조건에 노부합 n = 7
i가 5일 땐 두 조건에 노부합 n = 7
i가 6일 땐 첫번째 조건에 부합 n = 8, 두번째 조건에 노부합 n = 8

와우.. 대단한 풀이다. 일반 for문을 가지고 이렇게 생각할 수 있다니 ㅜㅜ
나는 하나하나 대입해서 풀어보니까 이해가 가는데, 처음부터 이 생각은 못할 것 같다 ㅜㅜ

profile
쓸모있는 기술자

0개의 댓글