https://programmers.co.kr/learn/courses/30/lessons/12899#
생각 1 :
규칙을 찾기
3진법과 비슷한 규칙을 찾아야할 것 같다
생각 2 :
나는 규칙을 잘 못찾기에 등비수열로 풀어보려고 했었다.
그런데 이거를 못하겠어서 다시 생각1로 돌아왔다.
나는 규칙을 잘 못 찾는다..
따라서 많은 경우를 그림으로 그려보았다.
따라서
3진법으로의표기한 수를 → 124 수로 바꾸는 과정의 함수 convert를 작성했다.
여기서 주의할 것은
0이 반복되는 경우다
- 한 번에 하나의 0만을 없애줘야 한다.
- 뒤에 자리의 0인 부분을 없애주려다가, 앞자리에 0이 생기기도 한다.
- 따라서 매번, 모든 자리수를 탐색하며 처음으로 0 이 나올 때 까지 탐색 → 0이 나온부분을 없애줌 → 종료 → 다시 처음부터 탐색 → 0 나올 때 까지 탐색 → 0 이 나온 자리를 없애줌 →....... 을 반복하는데, 0인 부분이 없을 때 까지 반복
- 여기서 “ 0 이 나온 부분을 없애줌” 이라는 것은 [ 앞 자리를 -1 && 0인 자리에 3을 위치시킴 ] 을 의미한다.
// result를 변환한다 : 0 인 자리를 채워 나간다 public void convert(){ // 1101001 이런 경우 또한 고려해야함. // 변환시킨 부분이 없을 때 까지 반복한다. while(recurConvert()); } // 변환시킨 부분이 있으면 true public boolean recurConvert(){ for ( int i = cnt; i > 0 ;i--){ if( result[i-1] == 0){ result[i]--; result[i-1]=3; return true; } } return false; }
class Solution {
public int[] result = new int[1000]; // 임의의 길이로 세팅. 여기서는 1,2,4로만 표현하니 0 -> 없는 수
public int cnt = 0;
public String solution(int n) {
String answer = "";
createThree(n);
convert();
// printResult();
answer = trim();
return answer;
}
public void createThree(int n){
int cur = 0;
int target = n;
while(target/3 != 0){
cur = target % 3;
result[cnt++] = cur;
target /= 3;
}
result[cnt] = target %3;
}
// result를 변환한다 : 0 인 자리를 채워 나간다
public void convert(){
// 1101001 이런 경우 또한 고려해야함.
// 변환시킨 부분이 없을 때 까지 반복한다.
while(recurConvert());
}
// 변환시킨 부분이 있으면 true
public boolean recurConvert(){
for ( int i = cnt; i > 0 ;i--){
if( result[i-1] == 0){
result[i]--;
result[i-1]=3;
return true;
}
}
return false;
}
public void printResult(){
for(int i = cnt;i>=0;i--)
System.out.print(result[i]);
System.out.println();
}
// 124 나라 수로 변환한다. 맨 앞자리에 0 인 부분은 제외하고 문자열로 만든다.
// 0112 -> 112 가 되는 거임
public String trim(){
int temp = 0;
StringBuilder sb = new StringBuilder("");
for(int i = cnt ; i >= 0 ; i--){
if((temp = result[i]) != 0){
if(temp==3) sb.append("4");
else sb.append(Integer.toString(temp));
}
}
return sb.toString();
}
}