문제

문제풀이
public String solution(int n) { //124나라의 숫자
String answer = "";
while(n>0){
if(n%3 == 1){ //나머지가 1일때,
n = n/3; //n값을 3으로 나눠주고
answer = "1" + answer; //answer에 1을 더함
}else if(n%3 == 2){ //나머지가 2일때,
n = n/3;
answer = "2" + answer;
}else if(n%3 == 0){ //나머지가 0일때,
answer = "4" + answer; //answer에 4를 더하고
n = n/3; //n값을 3으로 나눠준 뒤
n--; //n값에 1을 뺀다.
}
}
return answer;
}
우선 이 문제는 딱봐도 3진법으로 풀어라는 문제여서 3진법으로 풀려고 했는데 다른 부분은 문제가 없었는데
나눴을 때, 나머지가 0이 되는 즉, 3의 배수가 되는 부분이 문제였다.
이것이 삼진법에서는 0으로 표현을 하지만 이 문제에서는 그것을 4로 표현을 했기 때문에 이 부분이 조금 까다로웠다.
예를 들어,
십진법 6의 경우 삼진법으로 고치면 20이 되지만 124나라에서는 14가 된다.
십진법 12의 경우 삼진법으로 고치면 110이 되지만 124나라에서는 44가 된다.
그래서 규칙을 봤더니 20에서 0->4로 바꾸고 앞자리2를 1낮추면 14가 되고
110에서 0->4로 바꾸고 앞자리1을 1낮추면 0이되서 104가 되는데 여기서 다시 0->4로 바꾸고 앞자리 1을 낮추면 044
즉, 44가 되는 것을 발견할 수 있었다.
124나라에서 1은1 2는2이기 때문에 앞자리 1을 낮추는 것은 n에서 1을 뺀다는 의미와 같으므로
n을 3으로 나눈 나머지가 0일때는 나머지를 4라고 치고 answer에 4를 더하고 n값을 3으로 나눠준 뒤 n에 1을 빼면 된다.
근데 나는 이렇게 복잡하게 풀었는데 다른 푸신분들 풀이중에 엄청난 것이 있었다...
public String solution(int n) {
String[] num = {"4","1","2"};
String answer = "";
while(n > 0){
answer = num[n % 3] + answer;
n = (n - 1) / 3;
}
return answer;
}
바로 이것이다...
정말 n = (n - 1) / 3; 이 부분은 상상치도 못한 부분이었다!
이 부분에 대한 설명은
1,2,4 숫자 체계에서 3씩 나누면 한 칸씩 당겨진다. 하지만 문제가 발생하는데
이에 대해 설명을 돕기위해 1, 2, 4를 1, 2, 3이라고 가정한다.
만약, 133일경우 한 칸씩 당기면 13.3이 되는데 이때 0.1은 10진수로 1/3이 된다. 그래서 13.3의 0.3이 1이되어서 몫에 영향을 주게 된다. 그래서 나누기전에 -1을 해주면 소수점 값이 0.3일때 몫에 영향을 줄 일이 없게 되고 111을 당길경우 1을빼면 33이되고 이를 3으로 나누어서 당겨주면 3.3이되는데 0.3은 1이되므로 3 + 1해서 11이되어서 정상적으로 당겨지게 된다. 당기면서 3모듈러연산하면 1의자리수 알 수있으니 계속 당기면서 1의자리 추출해준것이다.
라고 설명이 되어져 있는데 정말 대단한 것 같다...
이런 발상은 나는 언제쯤 할 수 있을까...
'프로그래머스 > Level 2' 카테고리의 다른 글
| [프로그래머스][Level2][Java] 주식가격 (0) | 2022.03.21 |
|---|---|
| [프로그래머스][Level2][Java] 프린터 (0) | 2022.03.18 |
| [프로그래머스][Level2][Java] 다음 큰 숫자 (0) | 2022.03.11 |
| [프로그래머스][Level2][Java] 땅따먹기 (0) | 2022.03.10 |
| [프로그래머스][Level2][Java] 숫자의 표현 (0) | 2022.03.08 |