문제
풀이
(1) 문제 분석하기
10진법 → 3진법
- 먼저 3진법을 어떻게 도출해내는지 알아보자.
- 10진법으로 표현되어 있는 수를 3으로 계속 나눈 나머지를 뒤에서부터 올린다.
- 45를 3진법으로 나타내면 1200이다.
3진법 → 10진법
- 다시 3진법을 10진법으로 변환해보자.
45 = ( 1 X 3³ ) + ( 2 X 3² ) + ( 0 X 3¹ ) + ( 0 X 3 )
다시 문제로 돌아와서,
- 데이터 삽입이 자유롭고, 인덱스로 접근이 쉬운 Arraylist를 이용하였다.
- 반복문을 통해 3으로 계속 나눈 나머지를 list로 add() 한다.
- 포인트는 굳이 3진법 앞뒤반전을 하지 않아도 곱해주는 3의 n승으로 조정할 수 있다는 것이다.
- 10진법으로 변환할 때는 제곱 함수 Math.pow(밑, 지수)를 이용한다.
(2) 슈도코드 작성하기
3진법 수를 담을 Arraylist 선언
while(n이 0보다 클 때) {
list에 n % 3 값을 add()
n을 3으로 나누고 그 값을 다시 n에 담음
}
// list = {0, 0, 2, 1}
for(list의 size까지) {
list의 요소에 하나씩 접근하여 3의 3승 ~ 3의 0승까지 곱한 후 더하기
}
// ( 0 x 3³ ) + ( 0 x 3² ) + ( 2 x 3¹ ) + ( 1 x 3 )
(3) 코드 구현하기
package algorithm.test13;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
// 10진법 -> 3진법으로 변환 후 list 삽입
// 다시 10진법으로
public static void main(String[] args) {
int n = 45;
System.out.println(solution(n));
}
public static int solution(int n) {
int answer = 0;
List<Integer> temp = new ArrayList<>();
// 3진법으로 변환하여 list에 담기
while (n > 0) {
temp.add(n % 3);
n /= 3;
}
for (int i = 0; i < temp.size(); i++) {
answer += (Math.pow(3, temp.size()-i-1)*temp.get(i));
}
return answer;
}
}
+) 다른 풀이 방법
- N진수를 10진수로 변환할 때 → Integer.parseInt(N진수, N)
- N진수의 타입은 String이기 때문에 list가 아닌 String으로 3진법 수를 받는다.
package algorithm.test13;
public class Solution {
// 10진법 -> 3진법으로 변환 후 String에 담기
// Integer.parseInt() 이용해서 다시 10진법으로
public static void main(String[] args) {
int n = 45;
System.out.println(solution(n));
}
public static int solution(int n) {
String str = "";
while(n > 0) {
str += n % 3;
n /= 3;
}
return Integer.parseInt(str, 3);
}
}
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'📊 Algorithm&SQL' 카테고리의 다른 글
[Java/프로그래머스] 같은 숫자는 싫어 (0) | 2022.11.19 |
---|---|
[Java/프로그래머스] 최소직사각형 (0) | 2022.11.19 |
[Java/프로그래머스] 하샤드 수 (0) | 2022.11.19 |
[Java/프로그래머스] 콜라츠 추측 (0) | 2022.11.19 |
[Java/프로그래머스] 자릿수 더하기 (0) | 2022.11.19 |