뚝딱햄 탈출기

[JavaScript] 엘리스 트랙 - 3, 6, 9 게임 본문

Algorithm & Data structure/알고리즘 문제 풀이

[JavaScript] 엘리스 트랙 - 3, 6, 9 게임

hyrmzz1 2023. 8. 10. 17:48

3, 6, 9 게임

1부터 30까지 3, 6, 9게임을 하는 프로그램을 작성해 봅시다.

3, 6, 9게임의 규칙은 다음과 같습니다.

  • 1부터 차례대로 말한다.
  • 숫자 3, 6, 9가 들어가는 수의 경우에는 짝!을 출력한다.
    • 예시) 6, 19, 23, 35

지시사항

위 3, 6, 9게임의 규칙에 맞게 1부터 30까지 출력되는 결과를 배열에 담아 solution 함수 안에서 return 해주세요.

내 오답

function solution() {
    const num = [];

    for (let i = 1; i <= 30; i++){
        if ((i % 10) % 3 === 0){ // i의 1의 자리 수 % 3 === 0
            num.push("짝!");
        } else if (Math.floor(i / 10) % 3 === 0){   // i의 십의 자리 수 % 3 === 0
            num.push("짝!");
        } else{
            num.push(i);
        }
    }
    return num;
}

// 실행 혹은 제출을 위한 코드입니다. 지우거나 수정하지 말아주세요.
module.exports = solution;

오답 원인

오류 : 10 미만의 모든 수와 10, 20이 "짝!" 으로 출력됨.

10, 20이 "짝!" 으로 출력되는 이유?

(i % 10) % 3 === 0 은 (i % 10) 을 통해 일의 자리 수를 구하고, 그걸 3으로 나눈 나머지가 0인지 판별해 일의 자리 수가 3의 배수인지 확인하기 위해 작성한 코드였다.

그러나 (i % 10) === 0 일 경우 (= 일의 자리 수가 0) 일의 자리 수가 3의 배수가 아니더라도 (i % 10) % 3 === 0 이 성립한다. (0 % 3 === 0)

=> 따라서 (i % 10) !== 0 조건문도 함께 작성해주어야 한다.

1 ~ 9 사이 모든 수가 "짝!" 으로 출력되는 이유?

Math.floor(i / 10) % 3 === 0 는 Math.floor(i / 10) 를 통해 십의 자리 수를 구하고, 십의 자리 수가 3의 배수인지 확인하기 위해 작성한 코드였다.

그러나 위와 마찬가지로 Math.floor(i / 10) === 0 일 경우 (= 십의 자리 수가 0. 한 자릿수) Math.floor(i / 10) % 3 === 0 이 성립한다.

=> 따라서 Math.floor(i / 10) !== 0 조건문도 함께 작성해주어야 한다.

정답

function solution() {
    const num = [];

    for (let i = 1; i <= 30; i++){
        if ((i % 10) % 3 === 0 && (i % 10) !== 0){
            num.push("짝!");
        } else if (Math.floor(i / 10) % 3 === 0 && Math.floor(i / 10) !== 0){
            num.push("짝!");
        } else{
            num.push(i);
        }
    }
    return num;
}

// 실행 혹은 제출을 위한 코드입니다. 지우거나 수정하지 말아주세요.
module.exports = solution;
Comments