백준 1373번 Node.js(자바스크립트) 풀이
❓ 문제
2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.
💻 입력
첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.
📈 출력
첫째 줄에 주어진 수를 8진수로 변환하여 출력한다.
👩🏻 내가 제출한 코드
const input = require('fs').readFileSync("dev/stdin").toString().trim().split("");
const inputArray = [];
for (let i = input.length; i > 0; i -= 3) {
inputArray.push(input.slice(Math.max(0, i - 3), i));
}
inputArray.reverse();
if(inputArray[0].length<3){
inputArray.forEach(subArray => {
while (subArray.length < 3) {
subArray.unshift('0');
}
});
}else if(inputArray[inputArray.length-1].length<3){
inputArray.forEach(subArray => {
while (subArray.length < 3) {
inputArray.push('0');
}
});
}
const newArray = inputArray.map(function(subArray) {
subArray = subArray.reverse().map((value, index) => {
return value * Math.pow(2, index);
}).reverse();
let sum=0;
for(const char of subArray){
sum += char;
}
return sum;
});
console.log(newArray.join(""));
👩🏻💻 풀이
이 문제에서는 먼저 2진수를 8진수로 변환하는 방법에 대해 잘 알고있어야한다. 그래야 풀이도 이해가 될 것이다.
일단 2진수를 8진수로 변환하기 위해서는
1) 11001100을 오른쪽에서 왼쪽으로 3개씩 쪼개서 나누고(소수점 왼쪽기준 오른쪽은 오른쪽에서 왼쪽으로 나눈다.)
2) 11 001 100 이런식으로 되는 경우에는 11 앞에 0을 붙여서 011 001 100으로 계산한다.
3) 3개의 덩어리(?)로 나누어진 수를 2의N제곱을 곱한다.(여기서 N은 배열순서)
>> 011의 경우 (0x2²) (1x2¹) (1x2⁰) 이런식으로! 이걸 3개의 덩어리 모두 적용
4) 3번 곱한 값을 더한다. >> (0x2²)+(1x2¹)+(1x2⁰) / (0x2²)+(0x2¹)+(1x2⁰) / (1x2²)+(0x2¹)+(0x2⁰) ↓ / ↓ / ↓ 3 1 4
5) 그러므로 2진수 '11001100'를 8진수로 변환하면 314가 된다!
// 새로운 배열을 생성
const inputArray = [];
// 배열의 뒤쪽에서부터 3개씩 요소를 가져와 새 배열에 추가
for (let i = input.length; i > 0; i -= 3) {
inputArray.push(input.slice(Math.max(0, i - 3), i));
}
//결과를 뒤집어 원래 순서대로 만들기
inputArray.reverse();
>> arr.slice([start[, end]]) : 배열의 특정 범위의 요소를 잘라내어(slice) 추출한 결과를 새로운 배열로 반환하는 함수
start : 추출을 시작할 0부터 시작하는 인덱스를 지정
end : 추출을 끝낼 인덱스를 지정
>> Math.max(파라미터 1, 파라미터 2) : 인자1과 인자2 중 큰 값을 리턴 / i-3이 음수이면 0을 사용하도록 하기 위해 씀
//2진수는 오른쪽에서 왼쪽으로 3개씩 자르는데
//첫번째와 마지막의 배열요소가 3개가 되지 않는 경우에는 0을 붙여준다.
//첫번째는 앞에 붙여주고 마지막은 뒤에 붙여준다.
if(inputArray[0].length<3){
inputArray.forEach(subArray => {
while (subArray.length < 3) {
subArray.unshift('0');
}
});
}else if(inputArray[inputArray.length-1].length<3){
inputArray.forEach(subArray => {
while (subArray.length < 3) {
inputArray.push('0');
}
});
}
>> forEach : 배열은 순회하면서 배열의 각 요소에 대해 주어진 함수를 순서대로 한 번씩 실행
>> arr.unshift() : 배열 제일 맨 앞에 값 추가
>> arr.push() : 배열 제일 맨 뒤에 값 추가
const newArray = inputArray.map(function(subArray) {
// subArray의 요소를 뒤집어서 계산
subArray = subArray.reverse().map((value, index) => {
return value * Math.pow(2, index);
}).reverse(); // 다시 원래 순서로 뒤집기
//배열끼리 더하기
let sum=0;
for(const char of subArray){
sum += char;
}
return sum;
});
console.log(newArray.join(""));
>> arr.map() : 원본 배열을 변경하지 않고 각각의 요소에 콜백 함수를 호출하여 새로운 배열을 만든다. 링크
>> Math.pow(밑수, 지수) : 제곱인 수 구할때 씀, Math.pow(3,2)라고 하면 3² 이거임
🤓문제 풀면서 느꼈던 점이나 고민했던 점
2진수를 8진수로 변환시키는 방법 자체가 헷갈려서 조금 헤맸다. 자바스크립트 함수를 조금 더 유연하고 자유자재로 사용하고 싶은데 아직 많이 서툴고 버벅인다. 개발자는 구글링이 필수이지만 그래도 아는 만큼 보인다고 여러함수들을 제때 잘 활용하는 날이 얼른 왔으면 좋겠다.
요소들은 왜 reverse로 뒤집어야 하는지 잘 몰라서 부분부분마다 console.log를 심어뒀는데 문제 제출할때 제대로 처리하지 않고 바로 제출했더니 한번 틀렸다. 문제 제출할때에는 반드시 정답만 출력되도록 신경쓰자!
🔗문제 링크
https://www.acmicpc.net/problem/1373
'Coding With Jina > Coding Test' 카테고리의 다른 글
[코딩테스트] 백준 1935번 Node.js(자바스크립트) 풀이 (0) | 2024.05.01 |
---|---|
[코딩테스트] 백준 9012번 Node.js(자바스크립트) 풀이 (0) | 2024.04.29 |
[알고리즘] 에라토스테네스의 체 (0) | 2024.04.25 |
[코딩테스트] 백준 2609번 Node.js(자바스크립트) 풀이 (0) | 2024.04.24 |
[코딩테스트] 백준 17413번 Node.js(자바스크립트) 풀이 (0) | 2024.04.24 |