문제 설명
124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
- 124 나라에는 자연수만 존재합니다.
- 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
10진법124 나라10진법124 나라1 | 1 | 6 | 14 |
2 | 2 | 7 | 21 |
3 | 4 | 8 | 22 |
4 | 11 | 9 | 24 |
5 | 12 | 10 | 41 |
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.
제한사항- n은 50,000,000이하의 자연수 입니다.
입출력 예nresult
1 | 1 |
2 | 2 |
3 | 4 |
4 | 11 |
20220906 진행중인코드
아!.. 대충 뭔지는 알겠는데.. 이걸 코드로 어떻게 표현하지?? 전직장 동료의 풀이법을 빌려서 해보도록 하자.
1. 124 나라에선 사실상 3진법과 다름이 없다. 다만 숫자표현이 1,2,4 일뿐, 그렇기 때문에 3/4 -> 몫1, 나머지1로 자릿수가 하나 올라가고, 나머지1이 붙어서 11이다.
2. 하나 더 예를들어 10을 보면 3/10 -> 몫 3, 나머지가 1로 3에 해당하는 4, 그리고 나머지 1이 붙어 41이다.
3. 즉, 나머지로 맨끝 수가 결정되고(1,2 -> 1,2, 그대로 맵핑, 0으로나눠 떨어지면 4이다.)
4. 몫으로 마지막 자리수를 제외한 모든게 결정된다.
5. 그럼 몫은 어떻게?...
6. 계속 계산해보니 몫도 3으로 나누어 떨어질때까지 진행하며, 각 나머지가 자릿수가 된다.
그런데!... 오류가 난닷!
1. 나누어떨어질 경우 무한루프
2. 왜인지 모르나 거꾸로 나올때도 있음
class Solution {
public String solution(int n) {
String answer = "";
int a=0;
int b=0;
String tmpAnswer = "";
while(a!=1){
a = number/3;
b = number%3 == 0 ? 4 : number%3;
tmpAnswer += b;
if(a==1){
tmpAnswer+=a;
}
number = a;
}
Arrays.stream(tmpAnswer.split("")).sorted(Comparator.reverseOrder()).forEach(s->{
System.out.print(s);
});
return answer;
}
}
20220907 진행중인 코드
아침이란 그런가.. 머리가 잘 안돌아감... 그냥 30분동안 쳐다보고 조금이나마 고민했음에 만족하자... 이것도 못할지도..
- 변수명을 a,b에서 좀더 의미 있게 바꿨다.
- 반복문을 while문에서 do while문으로 바꿨다.
- while문으로 하면 반복문조건에서 뭔가 안맞는게 생긴다.
public int solution(int number){
int portion=0;
int remainder=0;
String tmpAnswer = "";
String answer="";
do{
portion = number/3;
remainder = number%3 == 0 ? 4 : number%3;
number = portion;
tmpAnswer+=remainder;
}
while(portion>=1);
Arrays.stream(tmpAnswer.split("")).sorted(Comparator.reverseOrder()).forEach(s->{
System.out.print(s);
});
}
20220908 진행중인 코드
테스트케이스는 통과하는데 제출시 실패함... 그것도 엄청 많이.. 왜지 ㅡㅡ?...
class Solution {
/**
* 20220908
* 1. 파라미터를 3으로 나눈다.
* 2. 나머지 값이 0일 경우 4로, 나머지는 그대로 마지막 자릿수부터 채운다.
* 3. 1~2과정을 1에서 나온 몫에 대해 반복한다.
* 4. 언제까지? 몫이 3이하가 나올때까지!..
* @param number
*/
public String solution(int number) {
int portion=4; //while 문 초기에 걸리지 않기 위한 초기값
int remainder=0;
StringBuilder tmpAnswer = new StringBuilder();
String answer="";
while(portion>3){
//1~3은 바로 리턴한다.
if(number<=3){
return Integer.toString(number==3?4:number);
}
//나머지가 0이면 4로 매핑, 이외의 경우니 1,2는 그대로 사용한다.
remainder = number%3 == 0 ? 4 : number%3;
tmpAnswer.append(remainder);
portion = number/3;
//사실상 3진법이기 때문에 3이하는 몫을 그대로 첫째 자릿수에 매핑한다. 3은 4로 매핑!
if(portion<=3 && portion>0){
tmpAnswer.append(portion==3 ? 4 : portion);
}
number = portion;
}
answer = tmpAnswer.reverse().toString();
return answer;
}
}
20220908 참고풀이
결국 3일차까지 try했을때 실패해서 풀이를 검색해보았다... 그런데 보니까 결국 방법자체는 나랑 비슷한데, 코드 구현에 있어서 몇가지 빼먹은게 있었다. 첫 lv2도전 이었는데 너무 아쉽다. 몇일차다, 시간이 지났다, 이런거에 조급해하지 말고 천천히 푸는걸 연습해야 겠다... ㅠㅠ
class Solution {
/**
* 20220908 ref solved
* 1. 파라미터를 3으로 나눈다.
* 2. 나머지 값이 0일 경우 4로, 나머지는 그대로 마지막 자릿수부터 채운다.
* 3. 1~2과정을 1에서 나온 몫에 대해 반복한다.
* 4. 언제까지? 몫이 0이 될때까지!...
* 5. 단, 3으로 나누어 떨어지면 몫-1을 해줘야 한다.
* 6. 왜? 계산식에 의하면 3의배수가 되는 숫자에 한해서 이상한 계산이 나오게 된다.
* 7. 3진법이므로, 3의 배수가 될때마다 자릿수가 올라가서, 반복문을 한번 더 돌게 된다.
* 8. 그럴때 몫-1로 보정해주면 우리가 예상한대로 124 계산법과 맞게 나온다!
*/
public String solution(int number) {
int portion=number; //while 문 초기에 걸리지 않기 위한 초기값
int remainder=0;
StringBuilder answer = new StringBuilder();
//String answer="";
while(portion>0){
//나머지가 0이면 4로 매핑, 이외의 경우니 1,2는 그대로 사용한다.
remainder = number%3 == 0 ? 4 : number%3;
answer.insert(0,remainder);
portion = number/3;
if(remainder==4){
portion--;
}
number = portion;
}
return answer.toString();
}
}
refs
https://school.programmers.co.kr/learn/courses/30/lessons/12899
풀이참고
'알고리즘' 카테고리의 다른 글
프로그래머스[12951] - JadenCase 문자열 만들기(lv2) (0) | 2022.09.10 |
---|---|
최댓값과 최솟값(lv2) (0) | 2022.09.09 |
없는 숫자 더하기(lv1) (0) | 2022.09.03 |
음양 더하기(lv1) (0) | 2022.09.02 |
최소직사각형(lv1) (0) | 2022.09.01 |