문제 설명
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 100,000,000 이하인 자연수입니다.
입출력 예
nresult
45 | 7 |
125 | 229 |
입출력 예 설명
입출력 예 #1
- 답을 도출하는 과정은 다음과 같습니다.
n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
45 | 1200 | 0021 | 7 |
- 따라서 7을 return 해야 합니다.
입출력 예 #2
- 답을 도출하는 과정은 다음과 같습니다.
n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
125 | 11122 | 22111 | 229 |
- 따라서 229를 return 해야 합니다.
풀이코드
더보기
import java.util.*;
// 3진법 : 3증가시마다 한자리수씩 증가
// 나머지는 1 2 로 표현
// 3 = 10, 6 = 20, 9 = 100, 12 = 110, 15 = 120, 18 = 200, 21 = 210
// 2진법 문제를 풀때와 비슷하다고 보면됨
class Solution {
public int solution(int n) {
int answer = 0;
int num = n;
Stack<Integer> stack = new Stack<>();
// 3으로 나눈 나머지값을 stack에 담는다
while(num > 0) {
stack.push(num % 3);
num /= 3; // num을 줄여나가면서 while 종료
}
int cnt = 0; // 3의 n승 계산
while(stack.contains(1) || stack.contains(2)) {
// answer 에는 stack의 최상단값과 3의 n승을 곱한값을 담음
answer += (stack.pop() * (Math.pow(3, cnt)));
cnt++;
}
return answer;
}
}
풀이방법
10진법으로 받은 n이라는 정수를 삼진법으로 변환한후 그 삼진법을 뒤집어 다시 10진법으로 바꾸는 문제이다. 뒤집어야 한다는 점에서 Stack을 사용한다면 뒤집기를 하지않아도 된다고 판단하여 stack을 사용하였다.
- stack에 3을 나눈 나머지값을 담는다.
( 10진법의 2진법 변환도 이와같은 방식으로 할 수 있다. 단, 제대로된 3진법이나 2진법을 만들기위해선 마지막에 값을 뒤집어줘야한다. ) - num을 줄여줘야 반복문을 빠져나갈수있기때문에, num을 3으로 계속 나눠준다.
- 3진법을 다시 10진법을 바꿀때에는 자리수에 맞춰서 3의 n승을 곱 해주면된다. 여기서는 값을 뒤집어 담았기때문에 현재 값의 위치를 알수있는 cnt라는 변수를 선언하고 반복문을 돌때마다 증가시켜줬다.
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] 나머지가 1이 되는 수 찾기 (0) | 2021.11.08 |
---|---|
[Programmers] 최소직사각형 (0) | 2021.11.08 |
[Programmers] [1차] 다트게임 (0) | 2021.11.06 |
[Programmers] 짝지어 제거하기 (0) | 2021.10.07 |
[Programmers] 오픈채팅방 (2019 KAKAO BLIND RECRUITMENT) (0) | 2021.10.06 |