1. 문제
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 | result |
1 | 1 |
2 | 2 |
3 | 4 |
4 | 11 |
2. 나의 풀이
function solution(n) {
let answer = '';
const numArr = [4, 1 ,2];
while(n) {
// 나머지로 나오는 값을 배열의 인덱스로 사용
answer = numArr[n % 3] + answer
if(n % 3 == 0) {
n = (n / 3) - 1;
} else {
n = Math.floor(n / 3)
}
}
return answer;
}
- 1, 2, 4 이 3가지의 숫자로 10진법 숫자를 표현하는 나라다.
- 3을 기준으로 10진법 수를 나눠서 나머지를 [4, 1, 2] 배열의 index로 사용한다.
- 10진법 숫자 1을 기준으로 하면 1을 3으로 나누면 몫은 0 나머지는 1이다.
- 이 때, [4, 1, 2] 배열의 1번 인덱스의 값은 1이기 때문에 124나라에서는 1로 표현한다.
- 10진법 숫자 8을 기준으로 하면 8을 3으로 나누면 몫은 2 나머지는 2이다.
- 이 때, [4, 1, 2] 배열의 2번 인덱스의 값은 2이다. 아직 몫이 2가 남아있기 때문에 3으로
- 한번 더 나누어 주면, 마찬가지로 나머지가 2고, 배열의 2번 인덱스의 값은 2다.
- 즉, 124나라에서 숫자 8은 22로 표현된다.
- 문제는 3으로 딱 나누어 떨어질 때 이다.
- 10진법 숫자 9를 3으로 나누면, 몫이 3 나머지가 0이다.
- [4, 1, 2] 배열에서 0번째 인덱스는 4이다. 아직 나누기가 다 진행되지 않았다.
- 몫인 3을 나누면 나머지가 또 0이 되고 배열에서는 4다. 그렇게 되면 9는 124나라에서
- 44로 표현이 되야 하지만, 24로 표현이된다.
- 3으로 떨어지는 숫자의 경우에는 몫을 - 1을 해주어야 한다. 그렇게 되면
- 9라는 숫자를 3으로 나누면 몫은 3 나머지가 0 (배열에서 4를 획득)
- 몫에서 1을 빼면 2가 되고, 2를 3으로 나누면 나머지가 2 (배열에서 2를 획득)
- 9은 24라는 값으로 나오게 된다.
규칙을 찾으면 문제를 풀 수 있었다. 오랜만에 노트를 꺼내서, 어릴 때 배운 나눗셈을 떠..올...
다른 분들의 풀이를 보게 되니, if문으로 n값을 바꿔주는 것을 간결히 작성하신 것을 발견했다. 지난 번 풀이 때도, 이와 비슷한 풀이가 있었는데, 바로 적용하기는 쉽지 않은 것 같다! 다음에는 해봐야지!
n = (n % 3 === 0) ? (n / 3 - 1) : Math.floor(n / 3)
공부.. 공부
'리코딩 : 알고리즘' 카테고리의 다른 글
9. 프로그래머스 - 음양더하기 (0) | 2021.09.25 |
---|---|
8. 프로그래머스 - 로또의 최고 순위와 최저 순위 (0) | 2021.09.24 |
6. 프로그래머스 - 나누어 떨어지는 숫자 배열 (0) | 2021.09.16 |
5. 프로그래머스 - 3진법뒤집기 (0) | 2021.09.15 |
4. 프로그래머스 - 실패율 (0) | 2021.09.14 |