[프로그래머스 코딩테스트 입문] 저주의 숫자 3 | 알고리즘 설명 & 문제 풀이 with 자바스크립트(Javascript)

Re_Go·2023년 12월 12일
0

코딩테스트연습

목록 보기
23/106
post-thumbnail

1. 문제 설명

2. 제한 사항

3. 입출력 예

4. 입출력 예 설명

5. 첫번째 문제 풀이(2023-12-12)

이 문제는 얼핏 보면 간단한 문제이긴 한데, 생각보다 쉽지 않은 문제였습니다. 특히 이번 문제는 for문에 while문을 중첩 사용한 첫번째 사례가 아닌가 싶습니다.

문제의 예시에서는 마을의 숫자가 3의 배수이거나 3이 들어가려 할 경우 바로 한 칸 건너띕니다. 그래서 우선적으로 마을의 번호를 0으로 초기화 한 후 for문은 입력 받은 n만큼 돌면서 for문의 첫 부분에 마을 숫자를 1증가 시키도록 한 후

그 안에서 if조건으로 위의 해당 조건에 맞는 마을 번호가 있다면 추가로 1을 시켜주는 작업을 했는데 자꾸 미달이떠서 왜인가 하고 살펴봤더니

만약 마을 번호가 12(3의 배수)여서 1을 추가하게 되면 13이 되는데 마을 숫자에 13이 포함되니 당연히 한 번 더 건너띄어야 했던 것을 이 부분을 놓치고 말았던 것이죠.

그래서 while문에 조건을 넣어줘서 마을 번호가 해당 조건에 부합할 때 까지 마을 숫자를 누적시켜주는 코드문을 추가했습니다. 이럴 경우 마을 숫자가 14일 때 while문을 스킵하고 다시 다음 for문 루프를 돌 수 있으니까요.

function solution(n) {

    let townNumber = 0;
    for (let i = 0; i < n; i++) {
      ++townNumber;
      while(townNumber % 3 === 0 || String(townNumber).includes("3")){ // 추가로 배열 includes 메서드를 사용하기 위해서는 townNumber의 값이 문자열인 상태여야 하므로 String으로 문자열 변환을 해준 후 해당 메서드를 사용했습니다. 참고로 문자열도 배열 메서드의 사용이 가능하며, 이럴 경우 숫자 하나 하나를 확인 가능하죠. (물론 while문을 돌릴 때에만 조건을 재는 상황에서 형변환 하는거라 원본은 변환되지 않고 숫자 타입 그대로 존재합니다.)
          townNumber += 1;
      };
    };
    return townNumber;
}
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글