■ 문제 링크
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 메서드를 사용하니 코드가 한결 간단....
제공되는 클래스와 메서드들 레퍼토리가 적어서 더 많이 늘려나가야겠다 ㅎㅎㅎㅎ
잘못된 점이나 보충할 부분이 있으면 코멘트 남겨주세요
작은 조언이 저에겐 성장의 원동력이 됩니다 :-)
'알고리즘' 카테고리의 다른 글
[데알] 주어진 시각에서 특정 숫자 찾기(Python) (0) | 2021.08.16 |
---|---|
[데알] 프로그래머스 알고리즘 Lesson.42576 완주하지 못한 선수 (Java) (0) | 2020.11.17 |
[데알] 프로그래머스 알고리즘 Lesson.68644 두 개 뽑아서 더하기 (Java) (0) | 2020.11.16 |
[데알] 백준 알고리즘 No. 2577 숫자의 개수 (Python) (0) | 2020.11.15 |
[데알] 백준 알고리즘 No. 11654 아스키코드(Python) (0) | 2020.11.14 |
댓글