본문 바로가기
알고리즘

[데알] 프로그래머스 알고리즘 Lesson.68935 3진법 뒤집기 (Java)

by zannew 2020. 11. 18.

■ 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/68935

 

코딩테스트 연습 - 3진법 뒤집기

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

programmers.co.kr

 

 

■ 소스코드

 

▶ for만 사용

class Solution {
    public int solution(int n) {
       int answer = 0;
        String temary="";
        int temaryNum=1;
        while(n>2) {
        	temary+=(n%3)+"";
        	n/=3;
        }
        temary+=n+"";
        
        for(int i=0;i<temary.length();i++) {
        	int keyNum = Integer.parseInt(temary.substring(temary.length()-(i+1), temary.length()-i));
        	if(i==0) {
        		answer+=keyNum*1;
        	}else {
        		for(int j=1;j<=i;j++) {
        			if(j==i) {
        				temaryNum*=3;
        			}
        		}
        		answer+=(keyNum*temaryNum);
        	}
        }      
        return answer;
    }
}

 

▶ Math클래스 pow( ); 사용

:  위의 바깥 for 전체를 아래처럼 간단하게 코딩이 가능!!

for(int i=0;i<temary.length();i++) {
        	int keyNum = Integer.parseInt(temary.substring(temary.length()-(i+1), temary.length()-i));
        	temaryNum=(int) Math.pow(3, i);
        	answer+=(keyNum*temaryNum);
        }

 

 

 

■ 풀이

 

[3진수 구하기]

1) 주어진 숫자 n을 3으로 나눈 나머지를 String타입 temary라는 변수에 쌓는다. 그리고 복합 대입 연산으로 n을 3으로 나눈 값을 n에 저장한다. (변수 temary에는 문제에서 요구되는 n(3)을 뒤집을 필요 없이 역순으로 저장된다. )

[뒤집어진 3진 숫자를 10진수로 변환하기]

2) 뒤집어진 3진 숫자를 끝에서부터 하나씩 잘라서 int타입으로 변환해주고 1, 3², 3³, ... 3ⁿ 순으로 n(3)의 길이만큼 연산할 수 있도록 반복문을 활용한다.

3) 첫번째 등장한 if에서 첫 번째만 *1을 해서 더할 수 있도록 하고 그다음 숫자부터는 모두 else에 해당하기 때문에 3의 제곱된 수들만 곱해서 저장할 수 있도록 했다. 

4) 곱한 값들을 모두 복합대입연산으로 answer에 더해준다.

5) 마지막으로 answer를 리턴한다.

 

 

■ 후기

 

반복문과 if-else로 주먹구구식으로 풀었는데 Math클래스의 pow 메서드를 사용하니 코드가 한결 간단....

제공되는 클래스와 메서드들 레퍼토리가 적어서 더 많이 늘려나가야겠다 ㅎㅎㅎㅎ

 

 

 

 

 

 

 

잘못된 점이나 보충할 부분이 있으면 코멘트 남겨주세요

작은 조언이 저에겐 성장의 원동력이 됩니다 :-)

댓글