Algorithm/프로그래머스

[프로그래머스] Level1) 3진법 뒤집기

햄습햄 2021. 11. 12. 12:48

문제 설명

 

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

 

 

제한 조건

 

  • n은 1 이상 100,000,000 이하인 자연수입니다.

 


풀이 과정 (자바)

 

ArrayList<Integer> lst를 생성했다.

그리고 while 문을 돌면서 입력받은 n을 3으로 나눈 나머지 값을 lst에 넣었다.

while 문은 n을 3으로 나눠 0보다 클 때까지 진행했다.

 

int 형 배열 arr를 lst의 size 만큼으로 생성했고, int 형 j를 0으로 초기화했다.

for 문을 돌면서 lst에 있는 값을 arr에 넣었다.

 

int 형 answer, cnt, mul을 각각 0, 0, 1로 초기화했다.

 

while 문을 돌면서 mul에 3을 차례대로 곱했다.

(자릿수마다 (3, 3*3, 3*3*3....) 차례대로 3의 제곱들을 곱해 처리했다.)

 

그리고 해당 자릿수에 맞는 값 (arr[arr.length - 1 - len])과 mul을 곱한 값을 answer에 더했다.

다시 cnt, mul을 각각 0, 1로 처리하고 for 문을 진행했다.

 

for 문을 종료하고, answer를 반환했다.

 

더보기

arr[arr.length - 1 - len]인 이유?

 

mul은 1, 9, 27,... 순으로 점점 수가 커진다.

arr에 있는 값은 첫 번째 값이 가장 큰 자릿수이므로,

가장 마지막 mul과 곱해 처리해야 한다.

고로,

가장 마지막 index에 있는 값과 가장 첫 번째 mul과 곱해 처리해야 한다.

 

예시) 0021

0 0 2 1

 해당 배열은 길이가 4이고, mul이 1이라고 했을 때,

 

0: 0 * mul (3 * 3 * 3)

0: 0 * mul (3 * 3) 

2: 2 * mul (3)

1: 1 * mul (1)

(+)-------------------------

              7

 

 

결과

 

 


다른 사람의 풀이

 

String 형 a를 선언했다.

 

while 문을 돌면서 입력받은 n이 0보다 클 때,

n을 3으로 나눈 나머지 값을 a에 넣었다. (역순으로 처리됨)

 

parseInt(a, 3)를 통해 a 값을 3진법으로 읽어 정수로 변환해 반환했다.

 

 

기타

 

3진법에 대해 먼저 학습 후, 문제를 풀었다.

다른 사람의 풀이로 진행했을 때, 비록 시간이 오래 걸리긴 했지만, 너무나도 간략하고 가독성이 높은 방법이었다. 같은 문제라도 다양한 방법으로 처리할 수 있어 신기했다.