일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- js
- SQL 고득점 Kit
- 토익
- programmers
- 프로그래머스
- 회고
- javascript
- 자바스크립트
- 알고리즘
- 타입스크립트 올인원
- 타입스크립트
- 리덕스
- 제로초
- 2주 프로젝트
- til
- Async
- 4주 프로젝트
- codestates
- 리트코드
- python
- 렛츠기릿 자바스크립트
- 정재남
- 리액트
- 손에 익히며 배우는 네트워크 첫걸음
- 백준
- 파이썬
- 타임어택
- 코어 자바스크립트
- 코드스테이츠
- LeetCode
Archives
- Today
- Total
Jerry
프로그래머스 자바스크립트 - 3진법 뒤집기 본문
반응형
Pseudo Code
/*
1. n을 3진법으로 변환
- n이 0이 될 때까지, 나누어준다.
- 각 나머지를 문자열로 만들어 unshift로 더해준다.
2. 1의 결괏값 뒤집기
- reverse를 이용한다.
3. 2의 결과값, 10진법으로 변환
- 결과값의 마지막 요소부터 첫 번째 요소 순으로 탐색한다. (각 요소는 전 요소의 제곱)
- 각 요소의 값 * (3^idx)
- sum 변수를 이용해서 각 요소의 값을 누적값을 만든다.
4. 3의 결과값을 반환
*/
First Try
테스트 10이 통과가 안 되었다.
찾아보니, 큰 수가 들어올 경우에 sum이 너무 커진 게 문제였다.
Because JavaScript's numbers are IEEE-754 double-precision binary floating point (frequently known as "double"). They have only about 15 digits of decimal precision.
function solution(n) {
let remainder = [];
while (n >= 1) {
remainder.unshift(Math.floor(n % 3));
n = n / 3;
}
remainder = parseInt(remainder.reverse().join(''));
let len = remainder.toString().length;
let sum = 0;
remainder = remainder.toString().split("");
for (let i = len - 1; i >= 0; i--) {
sum += remainder[i] * 3 ** i;
}
return remainder;
}
Second Try
굳이 reserve 메서드를 사용할 필요가 없었다.
하지만, 또 다른 테스트 케이스가 통과가 안 되었다.
//!#2
function solution(n) {
let remainder = [];
while (n >= 1) {
remainder.unshift(Math.floor(n % 3));
n = n / 3;
}
remainder = parseInt(remainder.join(""));
let len = remainder.toString().length;
let sum = 0;
remainder = remainder.toString().split("");
for (let i = 0; i < remainder.length; i++) {
sum += remainder[i] * 3 ** i;
}
return sum;
}
Last Try
나머지를 담는 배열 remainder를 문자열로 바꾸고,
while문에서 원래 '+='를 이용하면 순차적으로 더해지는데, 대신에 풀어서 순서를 조절할 수 있게 했다.
누적 값은 reduce를 이용했다.
//!#3
function solution(n) {
let remainder = "";
while (n) {
let r = n % 3;
remainder = r + remainder;
n = Math.floor(n / 3);
}
return remainder
.split("")
.reduce((acc, cur, idx) => acc + Number(cur) * 3 ** idx, 0);
}
반응형
'Problem Solving > Algorithm 문제 풀기' 카테고리의 다른 글
[프로그래머스 / 자바스크립트] N개의 최소공배수 (0) | 2021.06.18 |
---|---|
프로그래머스 자바스크립트 - 스킬트리 (0) | 2021.06.15 |
[프로그래머스 / 자바스크립트]문자열 압축 (0) | 2021.06.10 |
[Programmers] 완주하지 못한 선수 (JavaScript) (0) | 2020.12.20 |
[HackerRank] Compare the Triplets.js (JavaScript) (0) | 2020.11.09 |