코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr

우선 아래는 내가 푼 해답

function solution(n) {
  const NumList = []

  while (true) {
    if (n > 3) {
      const temp = n % 3;
      if (Math.floor(temp) === 0) {
        NumList.unshift(4);
        n = n / 3 - 1;
      } else {
        NumList.unshift(Math.floor(temp));
        n = n / 3;
      }
    } else {
      if (Math.floor(n) == 3) {
        NumList.unshift(4)
        break;
      } else if (Math.floor(n) == 0) {
        break;
      } else {
        NumList.unshift(Math.floor(n))
        break;
      }
    }
  }

  return NumList.join("");
}

1,2,4 단위로 숫자가 올라가고 3개 단위로 뒷자리가 초기화되고 앞단위가 바뀌거나 추가된다.

처음에는 문제를 잘못 이해해서 아래와 같이 멍청하게 풀고있었다.. (쉬운 문제인줄 알았지..)

const fool = {
1:1,
2:2
3:4,
4:11,
5:12,
6:14,
7:21
8:22,
9:24,
10:41
}

잘못 풀고있다는걸 깨닫고 분명히 푸는 로직이 있을거라 생각해서 삼성노트를 켜서 로직을 계산해봤다.
그러다보니, 10진법 숫자를 3으로 나눈 나머지값이 [0,1,2]가 반복해서 나왔고, 나머지가 0일경우(또는 3의배수일경우) 맨 뒷자리가 4가 된다는것을 알았다.(1일경우 는 1, 2일경우 2)

가 나오는데, 소숫점부분은 Math.floor로 내려준다)

또한 n을 3으로 나누고 1을뺀 후 다시 값을 나눠서 나머지를 구하는것을 반복하면 앞자리수들도 답이 나온다.

function change124(n) {
  return n === 0 ? '' : change124(parseInt((n - 1) / 3)) + [1, 2, 4][(n - 1) % 3];
}

위 코드는 내가 푼건 아니고 풀고나서 다른사람의 풀이 보니까 완전 간결하고 멋있는 코드라서 같이 올려본다..
나는 두시간 가량 고민해서 28줄짜리 코드를 적었는데 이게 3줄만에 해결이 가능하다니..