BOJ[1252] - 이진수 덧셈 by JavaScript
이진수 덧셈
문제
언어
- JavaScript
순서도
- 주어진 a 와 b 를 배열 형태로 변환
- 크기가 81 인 배열 생성 후 0 으로 초기화
- a 와 b 의 원소가 남아있다면, a 와 b 에서 값 하나를 pop 해서 더하기
- 더한 값과 carry 값에 따라서 값 결정
- 결과 배열의 맨 앞까지 도달할 때까지 3, 4 번 과정 반복하기
- 결과 배열에 1 이 하나도 없다면 0 출력
- 결과 배열의 앞의 0 을 제거한 후에 문자열 형태로 변환 후 출력
문제 풀이 step 1
- 두 개의 이진수를 입력받아 이를 더하는 문제입니다.
- 각 이진수는 1 또는 0 으로만 이루어져 있으며, 0 으로 시작할 수도 있습니다. 또한 각 이진수의 길이는 80 을 넘지 않습니다.
- 우선, 주어진 두 개의 이진수를 배열 형태로 변환합니다.
- 그리고 두 개의 이진수를 더한 값을 담을 81 크기의 배열을 생성합니다. (크기 제한이 80 이므로 carry 까지 생각해서 81 로 결정)
- 그런 다음에 각각 이진수 배열에서 원소가 남아있다면, pop 을 해서 두 값을 더합니다.
- 더한 두 값과 carry 값에 따라서 조건을 분기합니다.
- 분기된 조건에 따라서 각 자리수의 값을 결정합니다.
- 위의 과정을 수행한 후 결과 배열에 1 이 하나도 없다면 0 을 출력합니다.
- 반대로 1 이 있다면, 앞의 0 을 모두 제거한 후에 문자열 형태로 변환 후 출력합니다.
- 추가 설명은 주석으로 작성하겠습니다.
후기
- 자바스크립트로 문제를 풀면서 배열을 생성할 때 크기를 초기화하지 않고 하는 것이 습관이 되었는데, 만약 명확하게 값을 잡아줄 필요가 있다면, 배열의 크기를 초기화 하는 방법도 정말 괜찮은 것 같습니다. (좀 더 넉넉한 크기로)
소스 코드
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const solution = (input) => {
const MAX = 81;
// 배열 형태로 변환
let [a, b] = input[0].split(" ").map((v) => v.split("").map(Number));
let carry = 0;
const sum = Array(MAX).fill(0);
for (let i = MAX - 1; i >= 0; i--) {
let [aNum, bNum] = [0, 0];
// 두 배열에서 pop
if (a.length > 0) aNum = a.pop();
if (b.length > 0) bNum = b.pop();
// 더한 값과 carry 값에 따라서 조건 분기
if (aNum + bNum === 2) {
if (carry === 0) {
sum[i] = 0;
carry = 1;
} else {
sum[i] = 1;
carry = 1;
}
} else if (aNum + bNum === 1) {
if (carry === 0) {
sum[i] = 1;
} else {
sum[i] = 0;
carry = 1;
}
} else {
if (carry === 0) {
sum[i] = 0;
} else {
sum[i] = 1;
carry = 0;
}
}
}
// 만약 결과 배열에 1 이 하나도 없다면 0 return
if (sum.filter((v) => v === 1).length === 0) return 0;
// 결과 배열에서 앞의 0 을 모두 제거한 후에 문자열 형태로 변환
let res = "";
let start = false;
for (let i = 0; i < MAX; i++) {
if (sum[i] === 0) {
if (start === false) continue;
else res += sum[i];
} else {
start = true;
res += sum[i];
}
}
return res;
};
console.log(solution(input));