[프로그래머스 lev2/JS] 124 나라의 숫자

woolee의 기록보관소·2022년 11월 25일
0

알고리즘 문제풀이

목록 보기
107/178

문제 출처

프로그래머스 lev2 - 124 나라의 숫자

나의 풀이

1차 시도 (15/100)

자릿수를 먼저 구하고,
(자릿수가 3+9+27 ... 이럴 때 증가하므로 3(1+2+ ...+n) 값보다 커지는 시점의 자릿수가 n뭐시기이다 이런 식으로 접근했다)

해당 자릿수에 대해서 재귀를 돌려고 해봤으나 당연히 실패했다. 재귀로 하나하나 찾는 게 아니라 규칙을 찾아야 할 것 같다.

function solution(n) {
  let answer = '';
  if (n === 1) return '1';
  if (n === 2) return '2';
  if (n === 3) return '4';


  const sr = [1, 2, 4];
  let digit = 1;
  let scope = 0;
  let prevScope = 0;
  // let scopeArr = [];
  while (1) {
    prevScope = scope;
    if (digit%2==1) {
      scope += 3*((digit+2)*((digit+1)/2) - (digit+1));
    } else {
      scope += 3*((digit+1)*((digit)/2));
    }
    // scopeArr.push(scope);
    if (scope < n) digit++;
    else {
      break;
    }
  } 
  // let cnt = n - scopeArr[digit-2];
  let cnt = n - prevScope;
  let arr = Array.from({length:digit});

  function dfs(L) {
    if (L>digit) return;
    if (cnt<0) return;
    if (L===digit) cnt -= 1;
    if (L===digit && cnt===0) {
      answer = arr.join('');
      return;
    }
    else {
      for (let i=0; i<3; i++) {
        arr[L]=sr[i];
        dfs(L+1);
        arr.pop();
      }
    }
  }
  dfs(0)
  return answer;
}

// console.log(solution(1));
// console.log(solution(2));
// console.log(solution(3));
// console.log(solution(4)); // "11";
console.log(solution(14));

다른 풀이 (통과)

3진법에서 규칙을 찾아야 한다는 생각을 너무 쉽게 포기해버렸다.

[프로그래머스] 124 나라의 숫자 / JavaScript
array.reverse() 대신 문자열에 더해줄 때부터 거꾸로 더해준다.

function solution(n) {
  let answer = '';
  const numArr = [4, 1, 2];
  
  while(n) {
      answer = numArr[n%3] + answer;
      // 0 == false
      n = n%3 === 0 ? n/3 -1 : Math.floor(n/3); 
  }
   
  return answer;
}
profile
https://medium.com/@wooleejaan

0개의 댓글