[코테] 3진법 뒤집기

JulyK9·2023년 5월 2일
0

문제

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

제출코드

function solution(n) {
  // 나머지를 저장해둘 빈배열
  let nTernery = []
  
  while(n > 0) {
    // 3으로 나눈 나머지를 기록할 변수를 선언
    const remainder = n % 3
    // 나머지를 빈 배열에 넣어 저장
    nTernery.push(remainder)
    // 내림을 해주지 않으면 정수가 아닌데도 작업을 계속하는 오류 발생
    n = Math.floor(n / 3)
  }
  // 반복 작업을 통해 나온 결과를 요구사항에 따라 처리하기 위해 뒤집기
  nTernery.reverse()
  
  // 10진법으로 변환 처리
  
  
  let sum = 0
  
  for(let i = 0; i < nTernery.length; i++) {
    sum = sum + nTernery[i] * 3 ** i
  }
  
  return sum
}

접근방법

  • 3진법으로 변환하기 위해 3으로 나눈 나머지를 기록해두어야 한다.
    => 특정 부분에 도달할 때까지 계속 나눠야 하므로 while 반복문을 사용하고, 나머지로 나온 수를 저장해둘 빈배열을 준비한다.
  • 몫에다가 다시 3을 나누는 작업을 반복해야 하므로 매개변수 n을 3으로 나눈 몫으로 재정의 한다. 여기서 주의할 점은, 내림 처리를 해주지 않으면 정수가 아닌 소수점으로 나오는 형태의 수에다가도 0이 될때까지 연산을 계속 반복하는 오류를 범하게 되므로 유의한다.
  • 배열 메서드로 배열 요소를 뒤집어서 처리하고
  • 10진법으로 다시 변환하기 위해 정해진 배열의 길이까지 반복 작업을 해야하므로 for문 활용
  • 10진법 변환 원리에 따라 거듭제곱 연산을 이용해 인덱스별로 처리하면서 더해준다.

다른풀이

const solution = (n) => {
    return parseInt([...n.toString(3)].reverse().join(""), 3);
}
  • 내장함수 toString()를 통해 인자로 들어온 자연수(number) n을 파싱하여 string으로 변환
  • toString()에 인자로 숫자를 넣으면 해당 진법의 숫자로 변환 파싱하여 string으로 뱉어낸다.
  • 배열 메서드 reverse를 사용하여 요소를 뒤집어 주기 위해 배열로 씌운다.
  • string을 배열로 씌우고 전개구문으로 풀어주면 string을 각 한자리의 요소를 펼쳐준다.
    => ['1200'] ->['1', '2', '0', '0'] 이런 식으로 되는 것이다..
  • join 메서드로 각 요소를 하나의 요소로 합쳐준다. join의 대상은 배열 메서드 이지만, 반환 결과는 문자열임에 유의한다.
  • parseInt() 함수를 통해 문자열을 파싱하여 특정 진수의 정수로 반환해준다. 참고로 parseInt() 함수의 첫번째 인자는 문자열이 아니더라도 추상연산을 통해 문자열로 변환하고 파싱한다고 한다.

회고

  • 자바스크립트의 내장 메서드의 기능을 자세히 알고 여러 방향으로 사용해봐야 다양한 활용이 가능하다는 생각이 들었다.
  • 이것을 원활하게 다룰 줄 알게 되면 효율성과 생산성에 좋은 결과를 가져다 줄 옵션이 생기므로 코테와 알고리즘도 그런 이유로 꾸준히 다뤄봐야 하겠다.

참고자료

profile
느리지만 꾸준하게. 부족하거나 잘못된 부분은 알려주시면 감사하겠습니다.

0개의 댓글