문제
124나라의 숫자는 아래와 같이 표현된다
1 - 1
2 - 2
3 - 4
4 - 11
5 - 12
6 - 14
n을 124나라의 숫자로 표현하라.
로직
설명하기 어렵지만 설명하자면..
n에서 누적합(sum)을 빼고 3의 현재 배수(now)로 나눈 값이 3의 전의 배수(before)보다 (0보다 크지만 before보단 작다, before보단 크지만 before의 2배보다 작다 , before의 2배보다 크거나 0과 같다.)에 따라 1, 2, 4가 추가되고 만약 sum+now가 n보다 크다면 종료된다.
예를 들어서 보면 아래와 같다. (n = 15, sum = 0)
now = 3의 1의 배수 = 3
before = 3의 0의 배수 = 1
(n-sum)이 before의 값에 따라 1, 2, 4 중 하나로 설정된다.
만약 now+sum가 n보다 크다면 종료, 아니라면 now의 인덱스 증가, sum += now
코드
import java.util.*;
class Solution {
public String solution(int n) {
StringBuilder sb = new StringBuilder();
int index = 1;
while(true){
int bef = (int)Math.pow(3, index-1);
int now = (int)Math.pow(3, index);
int left = n%now;
if(left == 0){
sb.append("4");
}
else if(left <= bef){
sb.append("1");
}
else if(left <= 2*bef){
sb.append("2");
}
else{
sb.append("4");
}
index += 1;
n -= now;
if(n <= 0){
break;
}
}
return sb.reverse().toString();
}
}
import java.util.*;
class Solution {
public String solution(int n) {
StringBuilder answer = new StringBuilder();
int index = 1;
int sum = 0;
while(true){
int now = (int)Math.pow(3, index);
int bef = (int)Math.pow(3, index-1);
int left = (n-sum) % now;
if(left <= bef && left > 0){
answer.append("1");
}
if(left > bef && left <= 2*bef){
answer.append("2");
}
if(left > 2*bef | left == 0){
answer.append("4");
}
if(n <= (sum+now)){
break;
}
index += 1;
sum += now;
}
answer.reverse();
return answer.toString();
}
}
class Solution {
public String solution(int n) {
StringBuilder answer = new StringBuilder();
String[] check = {"4", "1", "2"};
while(n > 0){
answer.append(check[n%3]);
n = (n-1)/3;
}
answer.reverse();
return answer.toString();
}
}
'Algorithm > Practice' 카테고리의 다른 글
Programmers - 가장 긴 팰린드롬 (V) (0) | 2023.07.04 |
---|---|
Programmers - 징검다리 건너기 with JAVA (V) (0) | 2023.07.03 |
Programmers - 삼각 달팽이 with JAVA (0) | 2023.07.02 |
Programmers - 쿼드압축 후 개수 세기 with JAVA (0) | 2023.07.02 |
Programmers - 자물쇠와 열쇠 with JAVA (0) | 2023.06.28 |