https://school.programmers.co.kr/learn/courses/30/lessons/12899
처음에 보기에는 쉬워보였는데 알고봤는데 문제를 완전 잘못 해석했다.
나의 코드
전체코드
let result = "";
function solution(n) {
let remainder = n % 3;
let quotient = Math.floor(n / 3)
if(!remainder){
quotient = Math.floor(n / 3) - 1;
remainder = 3
}
result += remainder;
if( quotient <= 3){
if(quotient)result += quotient
result = result.replace(/["3"]/g,"4")
return result.split("").reverse().join("")
}
return solution(quotient);
}
계속 풀다 꼬여서 질문하기에서 힌트를 보고 바로 풀었다.
내가 설명하는 것보다
직접 질문게시판에 올려주신 똑똑하신 분의 글을 가져왔다.
뭐 일단 말하자면 문제가 좀 딱떨어지는 문제가 아니라 맘에 안듭니다
ㅋㅋㅋ아마 대부분이 124로만 표현하면 이거 10진법에서 3진법으로 변환하는 문제구나!하고 쉽게 접근하셔서 막상해보니 뭔가가 이상한데? 이런식으로 생각하실겁니다.(아니라면 그 머리 부럽습니다)
하지만 124나라가 3진법은 맞긴 맞습니다만.. 0을 표시하 수 있는 방법이 없는것이 10진수하고 큰 차이 입니다.
보통 10진수에서 3진수로 바꿀려면 10진수의 있는 수가 3보다 작아질 때 까지 계속 나눠서 마지막에 나온 몫하고
그 중간에 나왔던 나머지들을 이어서 표시할겁니다.그렇지만 여기 124나라에서는 망할 놈들이 0은 필요가 없나봅니다.
그래서 진수변환시에 나머지가 0으로 떨어지는 경우가 있으면 몫을 하나 낮추어서 나머지가 3이 되도록 해주어야합니다.
안그러면 그 순간 124 나라는 사라지게 되고 012나라로 전락하게 되버립니다.
124나라에는 0이라는 수가 없기 때문에 나누어 떨어지는 것 자체가 나머지가 1일 경우라고 봐야합니다.
마찬가지로 3가지 수만 표현하기 때문에 나머지에 올 수 있는 수는 1,2,3 밖에 없을 겁니다.
갑자기 124나라인데 3은 어디서 왔냐고 하실 분이 계실 텐데 뭐 여기서 말하는 3은 그냥 숫자가 아니고 리스트에지정해 줄 인덱스라고 생각하시면 좋습니다.
이어서 말하면 3도 나머지에 무조건 포함되어야한다는 것입니다. 그렇지 않으면 0을 포함시키므로 3진법을 구현 할 수 없습니다.
필력이 안좋아서 이해가 부족하실 수도 있을텐데 뭐 대충 그렇습니다.
간단한 예를 들어봅시다.
문제에서도 알다시피 9는 124나라에서는 24라고 불릴겁니다.
그리고 이제부터는 값이 1이면 1, 2이면 2, 3이면 4에 대입해서 생각해주세용
9를 3으로 나눠봅시다. 나누어 떨어지죠??
근데 나누어떨어지면 0을 포함하는 것이라고 말했기에 몫인 3을 하나 빼서 2로 낮춰줍시다.그럼 현재 수는 2가 되고 나머지는 3이 됩니다. 2는 더이상 3으로 안 나누어 지므로 결과 값은 "23"이 됩니다.
하지만 아까 3은 4로 치환하여 쓰라고 했죠?그럼 결과 값은 "24"가 됨을 알 수 있습니다.
여기까지입니다
출처 : 프로그래머스 질문게시판
이 설명을 바탕으로 코드를 만들었다.
if(!remainder){
quotient = Math.floor(n / 3) - 1;
remainder = 3
}
이 구간은 나머지가 0이되면 안되기에 0이 될때 몫에서 1을 빼주고 나머지를 3으로 만들어주었다.
result += remainder;
if( quotient <= 3){
if(quotient)result += quotient
result = result.replace(/["3"]/g,"4")
return result.split("").reverse().join("")
}
return solution(quotient);
}
그러면 나머지를 결과에 포함시켜준다.
여기서 몫이 3이상이면 다시 divide 함수에 몫을 할당해서 몫을 3이하로 될때까지 나누어준다.
만약 몫이 3이하가 된다면 결과값에 더해준다
마지막으로 결과값의 모든 3을 4로 바꿔준다 왜냐면 124나라는 오직 1, 2, 4만 숫자로 쓸 수 있기 때문이다.
그리고 최종적으로 뒤집어주면 그게 답이다.
뒤집어주는 이유는 +=로 더해주는 것이기에 저장할수록 뒤로 저장되기때문이다.
진법바꾸는 것을 더 공부해야겠다.
아직 익숙하지가 않아 풀이법이 바로생각이 나지 않는다.
그리고 무조건 기존에서 문제에서 딱 떨어지는 해결책이 있다고만 생각하지말자
이번 풀이처럼 3진법계산을 조금 수정해서 풀 수 도 있다.
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스] level.2 최댓값과 최솟값 (0) | 2022.09.22 |
---|---|
[프로그래머스] level.2 타켓 넘버 ( 이걸본다면 단숨에 이해 가능!!) (1) | 2022.09.20 |
[프로그래머스-JS] level 2 멀쩡한 사각형 (*) (0) | 2022.08.10 |
[프로그래머스-JS] level 2 오픈채팅방 <공사중> (0) | 2022.08.09 |
[프로그래머스-JS] level 2 문자열 압축 <공사중> (0) | 2022.08.08 |