티스토리 뷰
출처: https://programmers.co.kr/learn/courses/30/lessons/12899
문제 설명
124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
- 124 나라에는 자연수만 존재합니다.
- 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
10진법 | 124 나라 | 10진법 | 124 나라 |
1 | 1 | 6 | 14 |
2 | 2 | 7 | 21 |
3 | 4 | 8 | 22 |
4 | 11 | 9 | 24 |
5 | 12 | 10 | 41 |
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.
제한사항
- n은 500,000,000이하의 자연수 입니다.
입출력 예
n | result |
1 | 1 |
2 | 2 |
3 | 4 |
4 | 11 |
나의 풀이
-첫 번째 시도(실패)
124나라의 규칙대로 숫자를 계속 써내려갔다. 3진법인건 알지만 혹시 뭔가 더 쉬운 방법이 있지는 않을까?? 하는 마음에 적어봤다.
1 | 1 | 11 | 42 |
2 | 2 | 12 | 44 |
3 | 4 | 13 | 111 |
4 | 11 | 14 | 112 |
5 | 12 | 15 | 114 |
6 | 14 | 16 | 121 |
7 | 21 | 17 | 122 |
8 | 22 | 18 | 124 |
9 | 24 | 19 | 141 |
10 | 41 | 20 | 142 |
계속 써보다가 발견한 규칙은 다음과 같다.
3N-2 | ***1 |
3N-1 | ***2 |
3N | ***4 |
그러니까 어떤 수보다 크거나 같은 3의 배수를 구하고. 그 3의 배수를 124나라 표기법으로 표기한 다음에 일의 자리 수만 바꿔주면 된다.
예를 들어, 4를 알고 싶다면. 4보다 크거나 같은 3의 배수인 6에 해당하는 124나라의 수에서 일의자리만 적당히 바꿔주면 된다.
4 | 11 |
5 | 12 |
6 | 14 |
모든 3의 배수를 124나라 표기법으로 표시할 수만 있으면 나머지는 크거나 같은 3의 배수에서 일의 자리만 바꿔주면 된다고 생각해서. 3의 배수에 집중하기로 했다.
3N의 124표기법을 알려면 N-1의 124표기법을 알아야 한다.
3N='N-1의 124 표기법' + '4'
3N | N-1 | N-1의 124 표기법 | 3N의 124 표기법 |
3 | 0 | 없음 | '4' |
6 | 1 | 1 | '1'+'4' = '14' |
9 | 2 | 2 | '2'+'4' = '24' |
12 | 3 | 4 | '4'+'4' = '44' |
15 | 4 | 11 | '11'+'4' = '114' |
18 | 5 | 12 | '12'+'4' = '124' |
21 | 6 | 14 | '14'+'4' = '144' |
24 | 7 | 21 | '21'+'4' = '214' |
27 | 8 | 22 | '22'+'4' = '224' |
30 | 9 | 24 | '24'+'4' = '244' |
33 | 10 | 41 | '41'+'4' = '414' |
36 | 11 | 42 | '42'+'4' = '424' |
39 | 12 | 44 | '44'+'4' = '444' |
재귀를 통해서 계속 파고 들어가다보면 결국 답이 나오는 건데, 재귀? 마음에 안들지만 일단 시도해보기로 했는데
계속 틀렸다. 이 방식으로 풀려고 한 2시간 코드 정도 계속 써봤는데 틀렸다. 내가 생각한 방법이 엉망인 것 같다.
-두 번째 시도
결국 지옥에서 빠져나와서, 3진법으로 바꿔서 풀어야겠다는 생각이 들었다.
<script type="text/javascript">
let n=30;
let answer='';
let country=[4,1,2];
let temp=[];
three(n);
function three(n){
if(n==0){
make124();
}
else{
let mock=Math.floor(n/3);
let nameozi=n%3;
temp.push(nameozi);
console.log("temp: "+temp)
if(nameozi==0){
mock--;
}
return three(mock);
}
}
function make124(){
temp=temp.reverse();
for(let i=0; i<temp.length; i++){
answer+=String(country[temp[i]]);
}
}
console.log("answer "+ answer);
</script>
temp에서 pop으로 꺼내려다가 몇 번 실패하고 그냥 reverse로 배열을 거꾸로 돌린 다음에야 간신히 성공했다.
왜 다 만들어 놓고 pop을 못 쓸까?
보통은 3진법처럼 하다가 나머지가 0이 될 때 몫에서 1을 빼고 넘겨주면 된다.
( 종이에 1부터 차례대로 3진법으로 만들어보면서 나머지가 0이 되는 상황에서 예외가 발생한다는 것을 알았고, 그 예외 상황과 기댓값을 비교해서 연결고리를 찾았다. )
풀고 나면 그래도 꽤 뿌듯한데. 다른 사람 풀이를 보면..
다른 사람 풀이
단 한 줄로 풀었다. 봐도 모르겠다^^
소감
처음에는 코딩테스트를 연습하려는 게 아니라 자바스크립트를 연습하려고, 자바스크립트를 더 잘 다루고 싶어서 코딩테스트에 접근했다. 모르는 내장 객체의 메서드를 배우려는 목적이었는데.
그런데. 겨우 2단계인데 원래 나의 목적보다 어떤 문제를 푸는 아이디어?에 더 집중을 하게 되는 것 같다. 다른 사람이 푼 거 보고 어지러워서 그냥 넘어가버리기도 하고;;
다른 사람 아이디어도 많이 보고, 좋다면 내 것으로 만드는. 그 과정이 중요한데 좀 귀찮다^^
그냥 1단계부터 풀면서 함수 정리나 해야겠다.
'자료구조 알고리즘' 카테고리의 다른 글
[프로그래머스] 모의고사 (java script) (0) | 2021.04.11 |
---|---|
[프로그래머스] K번째 수 (java script) (0) | 2021.04.10 |
[프로그래머스] 피보나치 수 (java script) (0) | 2021.04.09 |
[프로그래머스] 크레인 인형뽑기 게임 (java script) (0) | 2021.04.08 |
[프로그래머스] 완주하지 못한 선수 (java script) (2) | 2021.04.03 |
- Total
- Today
- Yesterday
- 투포인터
- 롱베케이션
- 투포인터 연습
- 면접비
- 서버개발
- 동적프로그래밍
- 그래프
- MySQL
- 다이나믹프로그래밍
- create databases;
- MOD
- 은둔청년체험
- 최소공통조상
- node.js
- 다이나밍프로그래밍
- create db
- DB 생성
- BFS
- 로드나인
- 서버점검
- 개발자면접
- 면접질문
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |