2024. 4. 11. 14:48ㆍ알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/12899
🚀문제 접근
124 나라에서는 모든 숫자를 1, 2, 4로만 표현한다. 즉, 숫자를 표현할 때 3개의 숫자로만 표현하므로 3진법이다.
N진법과 관련된 유형의 문제가 나오면 N으로 나누었을 때의 나머지를 활용하면 된다.
문제의 예시를 살펴보면 1 은 1에 대응하고, 2는 2에 대응하며 3은 4에 대응한다.
즉, 3으로 나누었을 때 나머지가 0이면 4에 대응하는 것이고, 나머지가 1이면 1에 대응하는 것이며 나머지가 2이면 2에 대응하게 되는 것이다.
이것을 배열로 표현하면 다음과 같다.
[ 4, 1, 2 ]
각 인덱스는 3으로 나누었을 때의 나머지에 해당하게 된다.
우리가 10진법을 3진법이든, 2진법이든 변경할 때 어떻게 하나?
10진법으로 표현한 수 N을 2진법으로 변경하려면 2로 계속 나누어 몫이 0이 될때까지 나눈다. 3진법도 마찬가지이다.
그렇다면 N을 3으로 계속 나누어 몫이 0이 될때까지 나누어주면 된다.
그런데 주의할 점이 있다.
만약 n이 3으로 나누어떨어진다면 n을 3으로 나눈 값에서 1을 뺀 수가 다음 n이 되어야한다.
위의 그림과 같이 1을 빼주지 않은 경우 올바른 값이 나오지 않는다.
🛠코드
원리를 아니 참 허망하게 짧고 쉽게 풀린다. 몰랐을 때는 어떻게 구현해야할 지 감도 안왔었는데...
지금부터 안 게 중요하다. 이제 알았으니 비슷한 유형에서는 절대로 틀리지 말자.
// N진법 -> N으로 나누었을 때의 나머지를 활용
function solution(n) {
let mod = [4, 1, 2];
let ret = "";
while(n){
ret = mod[n%3] + ret;
if(n%3 === 0) n = n/3 - 1;
else n = Math.floor(n/3);
}
return ret;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 2️⃣ - 전력망을 둘로 나누기 (0) | 2024.04.11 |
---|---|
Level 2️⃣ - 메뉴 리뉴얼 (0) | 2024.04.11 |
Level 2️⃣ - 연속된 부분수열의 합(Feat. 투포인터) (0) | 2024.04.10 |
Level 2️⃣ - 삼각 달팽이 (0) | 2024.04.10 |
Level 2️⃣ - 두 큐 합 같게 만들기 (0) | 2024.04.09 |