[Java] 3진법 뒤집기 (programmers)

Haeun Noh·2023년 1월 23일
0

programmers

목록 보기
34/64
post-thumbnail

0123


문제 설명

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


제한사항

n1 이상 100,000,000 이하인 자연수입니다.


입출력 예

nresult
457
125229

입출력 예 설명

입출력 예 #1
답을 도출하는 과정은 다음과 같습니다.

n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
45120000217

따라서 7return 해야 합니다.

입출력 예 #2
답을 도출하는 과정은 다음과 같습니다.

n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
1251112222111229

따라서 229return 해야 합니다.


풀이 방식

3진법으로 변환하는 방식은 2진법과 같이 3으로 나눈 나머지를 구하는 것이다. 따라서 여기서는 3으로 나눈 나머지를 문자열로 변환하여 몫이 0이 될 때까지 문자열을 연결하였다. 이렇게 문자열을 연결하면 따로 앞뒤 반전을 하지 않아도 자연스레 반전이 되게 된다.

이렇게 해도 되고 다른 사람의 풀이를 보니 Integer.parseInt(10진수,3)방식으로 하면 10진수3진법으로 바뀌게 되었다. 알고리즘을 테스트하기 위해서는 사용하는 것을 지양해야 하지만 이런 방식도 있다고만 알아두자.

이제 앞뒤반전인 3진수10진수로 바꿔야 한다. 이 부분에서 조금 애를 먹었는데 처음에는 3을 제곱하는 square 메서드를 만들어 매개변수의 만큼 3을 제곱해주었다.

후에는 Math.pow()메서드를 알게 되어 Math.pow(3, idx++) 형태로 사용하였다. 3idx승을 구할 수 있고, idxi와 별개의 변수로 두어 num10진수가 저장된 후 증가되도록 하였다.


소스 코드

// Math.pow를 사용하지 않은 버전
public class Solution {

	public int solution(int n) {
		int answer = 0;
		String str = "";
		
		int num = n;
		while(num != 0) {
			str += Integer.toString(num%3);
			num /= 3;
		}
		String[] arr = str.split("");// 배열로 값 하나씩 담기
		
		int idx = 0;
		for (int i = arr.length-1; i >= 0; i--) {
			num = Integer.parseInt(arr[i]);// 정수로 변환
			answer += (num*square(idx++));
		}
		
		return answer;
	}
	
	public int square(int idx) {
		int num = 1;
		for (int i = 1; i <= idx; i++) {
			num *= 3;
		}
		return num;
	}
}
class Solution {
    public int solution(int n) {
		int answer = 0;
		String str = "";
		
		int num = n;
		while(num != 0) {
			str += Integer.toString(num%3);
			num /= 3;
		}
		String[] arr = str.split("");// 배열로 값 하나씩 담기
		
		int idx = 0;
		for (int i = arr.length-1; i >= 0; i--) {
			num = Integer.parseInt(arr[i]);// 정수로 변환
			answer += (int)(num*Math.pow(3, idx++));
		}
		
		return answer;
    }
}

실행 결과



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글