Level
프로그래머스 Lv1
Recruitment
function solution1(n) {
  var answer = "";
  var count = 0;
  var numArray = [4, 1, 2];
  var temp = [];

  while (n !== 0) {
    if (n % 3 == 0) {
      temp.unshift(numArray[0]); // 4를 temp 앞 쪽에 unshift.
      n = Math.floor(n / 3) - 1;
    } else {
      temp.unshift(numArray[n % 3]); // 1 또는 2를 temp 앞 쪽에 unshift
      n = Math.floor(n / 3);
    }
    count++;
  }

  answer = temp.join(""); //

  return answer;
}

/*
테스트 1 〉	통과 (1.70ms, 37.4MB)
테스트 2 〉	통과 (1.71ms, 37.5MB)
테스트 3 〉	통과 (1.72ms, 37.4MB)
테스트 4 〉	통과 (1.60ms, 37.5MB)
테스트 5 〉	통과 (1.70ms, 37.6MB)
테스트 6 〉	통과 (1.73ms, 37.7MB)
*/

function solution12(n) {
  const strange = [1, 2, 4];
  const indexes = [];

  while (true) {
    indexes.push(strange[(n - 1) % 3]);

    if (n - 1 < 3) break;

    n = Math.floor((n - 1) / 3);
  }

  return indexes.reverse().join("");
}

/*

효율성 테스트

테스트 1 〉	통과 (1.73ms, 37.5MB)
테스트 2 〉	통과 (1.66ms, 37.4MB)
테스트 3 〉	통과 (1.68ms, 37.2MB)
테스트 4 〉	통과 (1.67ms, 37.3MB)
테스트 5 〉	통과 (1.75ms, 37.4MB)
테스트 6 〉	통과 (1.70ms, 37.6MB)

*/

function solution13(n) {
  // 재귀함수 사용
  const strange = [1, 2, 4];

  function append124(m, str = "") {
    if (!str) {
      // 초기값
      str += strange[(m - 1) % 3];
    }

    if (m - 1 < 3) return str; // 탈출조건

    const M = Math.floor((m - 1) / 3); // 몫

    return append124(M, strange[(M - 1) % 3] + str);
  }

  return append124(n);
}

/*

테스트 1 〉	통과 (1.79ms, 37.4MB)
테스트 2 〉	통과 (1.80ms, 37.4MB)
테스트 3 〉	통과 (1.60ms, 37.4MB)
테스트 4 〉	통과 (1.71ms, 37.3MB)
테스트 5 〉	통과 (1.70ms, 37.4MB)
테스트 6 〉	통과 (1.68ms, 37.2MB)

*/

/* 설명

1. 예전 풀이에서는 순서를 맞추기 위해 unshift 사용 

2. unshift 대신 array에 item을 push해두고 마지막에 reverse하는 방법으로 다시 짜봄
   
3. reverse 메소드 사용으 줄여보고자 재귀를 사용

*/