프로그래머스 0단계 - 저주의 숫자3

이종현·2024년 1월 16일
0

코딩테스트

목록 보기
16/24
post-thumbnail

문제 설명

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

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

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


제한사항

  • 1 ≤ n ≤ 100

입출력 예

nresult
1525
4076

1. 문제 이해

  • 3,6,9 게임에 3의 배수까지 제외하는 규칙 추가
  • input이 작기 때문에 시간복잡도는 문제 없음

2. 접근 방법

  • 직관적으로 생각하기
    • n만큼 반복한다.
    • 반복하면서 숫자를 하나씩 증가해나가면서 3,6,9와 3의 배수가 아닌 것들은 제외한다.
    • 제외하고 반복이 끝났을 때 증가한 숫자 중에 마지막 숫자를 리턴한다.

3. 코드 설계

  • 직관적으로 생각하기
    • let threeXNumber = 1
    • for(let i = 1; i ≤ n; i++)
    • threeXNumber++
    • const isMultipleOfThree = threeXNumber % 3 === 0
    • const isIncludeThree = […threeXNumber].find(x ⇒ x === ‘3’)
    • if(isMultipleOfThree || isIncludeThree)
    • threeXNumber++
    • return threwwXNumber

4. 코드 구현

function solution(n) {
  let threeXNumber = 1
  let threeXArray = []

  for (let i = 1; i <= n; i++) {
    const isMultipleOfThree = threeXNumber % 3 === 0
    const isIncludeThree = threeXNumber.toString().includes('3')

    if (isMultipleOfThree || isIncludeThree) {
      i--
      threeXNumber++
    } else {
      threeXArray.push(threeXNumber)
      threeXNumber++
    }
  }

  return threeXArray[threeXArray.length - 1]
}

다른 사람 풀이

function solution(n) {
  return [...Array(n * 3)]
    .map((_, i) => i + 1)
    .filter((num) => num % 3 !== 0 && !num.toString().includes("3"))[n - 1];
}
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;
}

회고

3의 배수를 판별하는 isMultipleOfThree와 3이 들어있는 숫자를 판별하는 isIncludeThree를 통해서 새로운 배열을 만들고 그 배열의 마지막 원소를 구하는 방식으로 해결했는데.. 다른 사람들 풀이중에도 나와 비슷한 게 있지만, 좀 더 간단하게 구현한 것도 있고, 고차함수를 이용해서 풀이를 해낸 것도 있었다. 아무튼 지금은 계속 떠오르는데로 직관적으로 풀이를 해볼 생각이고, 계속 익숙해질거다. 그 다음에 다른 사람들 풀이도 보고 이해하면서 조금씩 나도 점점 간략하게 풀이하는 것에 도전해보자.

profile
데이터리터러시를 중요하게 생각하는 프론트엔드 개발자

0개의 댓글