티스토리 뷰

https://school.programmers.co.kr/learn/courses/30/lessons/12899

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🤔 해결방법

1. n이 3의 배수가 아니면 십의자리 = 몫, 일의자리 = 나머지, n이 3의 배수면 십의자리 = 몫-1. 나머지 = 4로 놓는다.

2. 만약 몫이 3이상이면 재귀하여 몫을 다시 124 나라의 숫자로 바꾼다.

 

 

🔑 풀이

이 문제를 풀기 위해 먼저 124 나라의 규칙을 생각해봤다.

그냥 3진법이라기엔 3의 배수들은 값이 맞지 않았다. 

 

1나누기3 = 몫0, 나머지1 = 1
  2나누기3 = 몫0, 나머지2 = 2
  3나누기3 = 몫1, 나머지0 = 4

  4나누기3 = 몫1, 나머지1 = 11
  5나누기3 = 몫1, 나머지2 = 12
  6나누기3 = 몫2, 나머지0 = 14

  7나누기3 = 몫2, 나머지1 = 21
  8나누기3 = 몫2, 나머지2 = 22
  9나누기3 = 몫3, 나머지0 = 24

9까지의 숫자로 생각해보니 다음과 같은 규칙을 발견했다.

- n이 3의 배수가 아니면 십의자리 = 몫, 일의자리 = 나머지
- n이 3의 배수면 십의자리 = 몫-1, 나머지 = 4

 

하지만 위의 규칙에 의하면 10은 31이 나와야 하는데 41이었다.

124의 나라여서 3을 쓸 수 없기 때문에 3을 124 나라의 숫자로 바꾼 4로 대체해서 41인 것 같았다.

 

그렇다면 이에 따라 추가되는 규칙은 다음과 같은 두 가지 경우로 생각했다.
1. 몫에 3이 포함되면 3만 다시 124 나라의 숫자로 바꾼다.
2. 몫에 3이 포함되면 몫 전체를 다시 124 나라의 숫자로 바꾼다.


하지만 두 경우 모두 정확성 테스트에서 틀렸다는 결과가 나왔다😥

10 이상의 숫자들은 어떻게 나와야 하는지 알 수 있다면 정확한 규칙을 찾을 수 있을 것 같았는데

마침 프로그래머스 질문하기의 답변 중 누군가 10이상의 숫자의 답을 적어준 것을 발견했다.😮

이를 참고해 10 이상의 숫자들로 다시 규칙을 고민했다.

10나누기3 = 몫3, 나머지1 = 31 -> 41
  11나누기3 = 몫3, 나머지2 = 32 -> 42
  12나누기3 = 몫4, 나머지0 = 34 -> 44

  13나누기3 = 몫4, 나머지1 = 41 -> 111
  14나누기3 = 몫4, 나머지2 = 42 -> 112
  15나누기3 = 몫5, 나머지0 = 44 -> 114 

  16나누기3 = 몫5, 나머지1 = 51 -> 121
  17나누기3 = 몫5, 나머지2 = 52 -> 122
  18나누기3 = 몫6, 나머지0 = 54 -> 124

 

그냥 몫이 3이상이면 몫 전체를 124 나라의 숫자로 바꾸면 되는 것 같았다...😅
그래서 몫이 3이상이면 그 몫을 재귀하여 solution에 넣어 나온 값을 다시 몫으로 넣어봤다.

function solution(n) {
    let answer = "";
    let q = Math.floor(n / 3); // 몫
    let r = n % 3; // 나머지

    // 3의 배수이면
    if (r == 0) {
      q -= 1;
      r = 4;
    }

    // 몫이 3이상이면
    if (q >= 3) {
      q = solution(q);
    }
    answer = String(q) + String(r);
    return String(Number(answer));
  }

결과는 정확성, 효율성 테스트 모두 통과😀

규칙만 찾으면 쉽게 풀 수 있는 문제인데 규칙을 찾기까지 삽질을 오래해 문제를 푸는데 생각보다 오래걸렸다😅

 

댓글