문제
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
요구사항
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
제한조건
- n은 1 이상 100,000,000 이하인 자연수입니다.
입출력
n result 45 7 125 229
내가 생각한 로직
1. 빈 배열을 만든다.
2. 나머지를 저장할 변수를 만든다.
3. 10진법을 3진법으로 변환하기 위해서는 n을 3으로 나눌 때의 나머지를 알아야 되기 때문에, 나머지를 계산할 때마다 빈 배열에 값을 넣어둔다.
4. for문을 이용해서 역순으로 구한 3진법 배열을 다시 10진법으로 바꾼다.
5. 거듭제곱을 구해주는 Math.pow를 이용한다.
내가 구현한 코드
function solution(n) {
const arr = [];
let rest = 0;
for (let i = 0; 0 < n; i++) {
rest = n % 3;
n = Math.floor(n / 3);
arr.push(rest);
}
let answer = 0;
for (let i = 0; i < arr.length; i++) {
answer += arr[i] * Math.pow(3, arr.length-1-i)
}
return answer;
}
1시간을 다 써서 코드를 구현했다.
10진법을 3진법으로 바꾸는 for문에서 조건식을 설정하는 부분에서 오래 걸렸다.
역순 3진법을 10진법으로 바꾸는 for문에서는 3에 거듭제곱하는 숫자의 식을 생각하는데 오래 걸렸다.
다른 해결방법
사용한 도구: toString(), reverse(), join()
const solution = (n) => {
return parseInt([...n.toString(3)].reverse().join(""), 3);
}
이 문제가 한 줄로 가능했다는게 신기했다.
toString(3)을 이용하면 10진법의 수를 3진법 형태의 문자열로 변환해준다고 한다.
3진법 문자열을 spread operator을 이용해서 배열로 만들어 준 뒤, reverse를 통해 뒤집어 준다.
뒤집힌 배열을 join을 통해 하나의 문자열로 합쳐준다.
parseInt(문자열, 3)은 문자열을 3진법으로 인식하여 다시 10진법으로 바꿔준다.
사용한 도구: while문, unshift(), reduce(), Math.pow()
function solution(n) {
const answer = [];
while(n !== 0) {
answer.unshift(n % 3);
n = Math.floor(n/3);
}
return answer.reduce((acc,v,i) => acc + (v * Math.pow(3, i)),0);
}
while문을 이용해서 n이 0이 아닐 때까지 n을 3으로 나눈 나머지를 구한 코드를 구현했다.
reduce를 이용해서 3진법을 10진법으로 바꾸는 코드를 구현했다.
똑같은 원리로 코드가 작동하더라도 상황에 맞는 메서드를 잘 알고 있으면 코드가 간결해진다는 것을 느끼게 됐다.
'Algorithm > 프로그래머스 LV1' 카테고리의 다른 글
[프로그래머스] 최소직사각형 (Javascript) (0) | 2025.02.10 |
---|---|
[프로그래머스] 삼총사 (Javascript) (1) | 2025.02.07 |
[프로그래머스] 이상한 문자 만들기 (Javascript) (0) | 2025.02.05 |
[프로그래머스] 예산 (Javascript) (0) | 2025.02.04 |
[프로그래머스] 크기가 작은 부분 문자열 (Javascript) (2) | 2025.02.03 |