티스토리 뷰
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));
}
결과는 정확성, 효율성 테스트 모두 통과😀
규칙만 찾으면 쉽게 풀 수 있는 문제인데 규칙을 찾기까지 삽질을 오래해 문제를 푸는데 생각보다 오래걸렸다😅
'JS-algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 가장 큰 정사각형 찾기 (javascript) (0) | 2023.08.21 |
---|---|
[프로그래머스] 최고의 집합 (javascript) (0) | 2023.07.24 |
[프로그래머스] 단속카메라 (javascript) (0) | 2023.07.24 |