Lv1_3진법 뒤집기

Eugenius1st·2022년 8월 30일
0

Programmers_JavaScript

목록 보기
20/30
post-thumbnail

Lv1_3진법 뒤집기

문제

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

풀이 - 실패

  • while문 돌려서 3으로 몫을 계속 나눔, 나머지는 계속 누적하여 더한다.
  • 누적된 값을 3으로 계속 나눔, 나머지는 계속 3의 제곱을 누적하여 곱한다.

코드


이 코드가 왜 실패인지 당최 이유를 모르겠다.

function solution(n) {
  var answer = 0;
  let remainN = 0; //나머지, n은 몫
  let tmpN="";
  let multiN = 0; // 제곱하여 곱해줄 수
  while(n>0){
    remainN = n%3;
    n = parseInt(n / 3); // 정수로 변환
    tmpN += remainN;
  }
  n = parseInt(tmpN);
  while(n>0){
    remainN = n % 10;
     // 정수로 변환
    n = parseInt(n / 10);
    answer += remainN*(3**multiN);
    multiN++
	
  }
  return answer;
}

08/31 이유를 알아냈다.

Number 의 MAX 값보다 커서 안되는 것이다.
마지막 테스트 케이스 값은
3진법 뒤집기 : 78413450 -> 12110112211000212
수 뒤집기 : 12110112211000212 -> 21200011221101121
10진법 전환: 21200011221101120 -> 110105529
이 과정에서 21200011221101121 가 MAX를 넘어서
21200011221101120 으로 저장되는 것이다.

내 로직 자체가 잘못된 것은아니었다.
똑같은 코드를 파이썬으로 해보았더니 되더라..

Python 코드

def solution(n): #자바스크립트에서 내가 짠거랑 똑같이 적었는데 되더라..... 걍 MAX int 문제인걸로
    num = n
    answer = 0
    remainN = 0
    tmpN = ''
    multiN = 0
    while num > 0 :
        remainN = num %3
        num = num // 3
        tmpN += str(remainN)

    num = int(tmpN)

    while num > 0:
        remainN = num % 10
        num = num // 10
        answer += remainN * (3**multiN)
        multiN+=1

    return answer

배운것

메서드

  • Number.toString([radix]) :

숫자를 문자열로 변환하여 반환한다. 진법을 나타내는 2~36 사이의 정수값을 인수로 전달할 수 있다. 인수 생략시 기본값 10진법이 지정된다. // radix는 밑

  • parseInt(string, radix) :

전달 받은 문자열을 전달 받은 radix로 분석한 정수를 반환한다

메서드만을 이용하여 풀이

function solution(n) {
  let answer = n.toString(3).split("").reverse().join("");

  return parseInt(answer, 3);
}

근데 왜 위의 저 코드는 안되는지 당최 모르겠다.

알았다! Integer의 MAX값을 넘어서 그런 것이다. 그래서 메서드를 이용한 풀이와 비교해 보았다.

// 틀렸던 함수
function solution1(num) {
  var answer = 0;
  let remainN = 0; //나머지, n은 몫
  let tmpN = "";
  let multiN = 0; // 제곱하여 곱해줄 수
  while (num > 0) {
    remainN = num % 3;
    num = parseInt(num / 3); // 정수로 변환
    tmpN += remainN;
  }
// tmpN = '21200011221101121'
  num = parseInt(tmpN);//Number의 MAX 값을넘음
 // 21200011221101120 (1 작게 들어감)
  while (num > 0) {
    remainN = num % 10;
    num = parseInt(num / 10);    // 정수로 변환
    answer += remainN * 3 ** multiN;
    multiN++;
  }
  return answer;
}


//메서드를 이용한 풀이
function solution2(n) {
  let answer = n.toString(3).split("").reverse().join("");
  //answer = '21200011221101121'
  return parseInt(answer, 3); 
}


//함수 2개 호출 비교
console.log(solution1(78413450));//110105529
console.log(solution2(78413450));//110105530

solution1 과
solution2 를 비교해보라

profile
최강 프론트엔드 개발자가 되고싶은 안유진 입니다

0개의 댓글