<프로그래머스, 3진법 뒤집기>

Minwoong Kim·2022년 9월 16일
0

2022-Sep-16, today getting of my comfort zone.

예시)
(10진법) => n = 45
(3진법) => 1200
(반전) => 0021
(10진법) => result = 7

문제 설명

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

접근 방법

또 다른 배열 하나를 만들고, while 문을 사용하여 n을 3으로 나눴을 때의 나머지를 만든 배열에 push 한다. 그리고 3으로 나눈 후의 n의 값을 재할당하여 반복. 그리고, reduce를 사용하여 다시 10진수로 바꿔준다.

Comfort zone

Step 1
while 무한 Loop 걸어놓고, if~ if else ~ else 사용하여,

  1. 나머지가 0이면 push, n을 3으로 나눈 몫을 다시 n에 할당

  2. 나머지가 0이 아니면 n%3 push, [몫 * 3 + n%3 = 원래 n] 임을 활용하여, (n-n%3)/3 을 재할당.

  3. 1,2 과정을 거쳐 n이 3보다 작아지면 그때의 n을 push하고 break를 통해 while문을 빠져나온다.


Step 2
reduce 문을 이용하여, 다시 10진수로 바꿔주는 과정이다.
현재값에 3의 특정값 제곱을 곱해준 값을 누적하여 합해준다. 이때, 각 자리에 맞는 특정값 제곱을 위해 reverse로 한 번 뒤집어 주었다.

Step 1에서 push 하였으므로, n=45 일때 구해진 3진수는 [0,0,1,2]이다. 10진수 변환 과정이 (0 X 3^3) + (0 X 3^2) + (1 X 3^1) + (2 X 3*0) 이므로, reduce에서 index값을 활용한 제곱 연산의 수행을 위해 reverse 해준 것이다.(reduce에서는 맨 왼쪽 배열 요소부터 순회하기 때문에)

Getting out of comfort zone

훨씬 간결해졌다. 기존 무한 루프걸어 놓고, 특정 조건에 도달하면 탈출하도록 설계한 것과는 다르게 n이 3보다 크거나 같을 때만 작동하도록 하였다.

또한, 조건문을 쓰는 것이 아니라 Math.floor를 활용하여 n을 3으로 나눴을 때의 몫을 구했다. 그리고 reduce에서 10진수로 변환할 때, 인덱스으로 제곱하는 연산을 진행하기 위해 reverse를 활용했었는데, push가 아닌 unshift를 사용하여 reverse를 생략했다.

마지막으로, while 연산을 다 진행한 후, 그러니까 n이 3보다 작아졌을 때는 나누기 연산을 수행하지 않고 바로 n을 unshift 하도록 하였다.(이 연산이 없으면 1,2 가 배열에 포함되지 않는다)

느낀 점

  1. reduce 함수 복습하자.

  2. Case가 나눠질 때 조건문을 반사적으로 쓸 것이 아니라, 내장 함수를 통해 Case가 나누어 진다고 해도 결국 내가 원하는 연산을 반드시 수행하도록 하는 방법을 찾아보자.

profile
Get out of my comfort zone

0개의 댓글