반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 자바스크립트
- 그래프
- TCP
- ip
- typescript
- Crawling
- dfs
- Nestjs
- 타입스크립트
- 알고리즘
- HTTP 완벽 가이드
- type challenge
- 백준
- HTTP
- Node.js
- 프로그래머스
- 타입 챌린지
- BFS
- 수학
- 가천대
- 프로그래머스 레벨 2
- 소켓
- 문자열
- socket
- dp
- 크롤링
- Algorithm
- 쉬운 문제
- 레벨 1
- javascript
Archives
- Today
- Total
kakasoo
[node.js] 2진수 8진수 ( 백준 1373번 ) 본문
반응형
두 개의 코드를 제공한다. 그 외에도 틀린 경우가 많았지만, 가장 대표적인 틀린(?) 코드와, 정답을 작성한다.
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
main(line);
rl.close();
}).on("close", () => {
process.exit();
});
/**
*
* @param {string} line
*/
const main = (line) => {
// 1. 2진수를 10진수로 변환한다.
let ten = BigInt(0);
for (let i = 0; i < line.length; i++) {
const cur = line[i] * 2 ** (line.length - i - 1);
ten += BigInt(cur);
}
// 2. 10진수를 8진수로 변환한다.
const numbers = [];
let square = 0;
while (ten >= 8) {
const value = ten % BigInt(8);
numbers.push({ value: value, square: square++ });
ten = ten / BigInt(8);
}
numbers.push({ value: ten, square: square++ });
// 3. 숫자 부분을 이어서 출력해준다.
let answer = "";
numbers.reverse().forEach((el) => (answer += el.value));
console.log(answer);
};
위 코드로도 정답을 구할 순 있었다. 다만, 범위가 문제가 되었다.
기존에 진법 계산하듯 계산을 하기 위해서 2진수를 10진수로 바꾸었고, 그것을 다시 8진수로 바꾸어 주었다.
여기서 다만 이 숫자가 너무 커서 연달아 문제가 발생하였고, 따라서 line을 BigInt로 해야 한다고 생각했다.
다만 BigInt로 변환하더라도 숫자가 큰 건 마찬가지라 풀 수 없었다.
따라서 2진수에서 10진수로 변환하면 안 된다는 것을 알았다.
( 아니면 10진수로 변환할 때도 문자열처럼 변환을 해야 했을 것이다. )
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
main(line);
rl.close();
}).on("close", () => {
process.exit();
});
/**
*
* @param {string} line
*/
const main = (line) => {
const numbers = [];
while (line.length > 3) {
numbers.push(line.substr(line.length - 3, 3));
line = line.substr(0, line.length - 3);
}
numbers.push(line);
let answer = "";
numbers.reverse().forEach((el) => {
const ten = parseInt(el, 2);
const hex = ten.toString(8);
answer += hex;
});
console.log(answer);
};
그래서 2진수를 8진수로 바로 변환하는 코드를 작성하였다.
똑같이 문자열로 다루되, 중간에 10진수로 변환하지 않는다.
2진수에서 8진수로 넘어가는 특성 상 3자리 씩 자르면 변환할 수 있다.
예컨대,
2진수 100은 8진수로 1이다.
2진수 1 000은 8진수로 1 0이다.
2진수 10 000은 8진수로 2 0이다.
이런 느낌으로 변환을 하면 된다.
반응형
'프로그래밍 > 알고리즘 풀이' 카테고리의 다른 글
[node.js] 16진수 ( 백준 1550번 ) (0) | 2021.04.06 |
---|---|
[node.js] 뒤집힌 덧셈 ( 백준 1357번 ) (0) | 2021.04.06 |
[node.js] 진법 변환2 ( 백준 11005번 ) (0) | 2021.04.05 |
[node.js] 진법 변환 ( 백준 2745번 ) (0) | 2021.04.05 |
[node.js] GCD 합 ( 백준 9613번 ) (0) | 2021.04.05 |