이진수 덧셈

문제

언어

  • JavaScript

순서도

  1. 주어진 a 와 b 를 배열 형태로 변환
  2. 크기가 81 인 배열 생성 후 0 으로 초기화
  3. a 와 b 의 원소가 남아있다면, a 와 b 에서 값 하나를 pop 해서 더하기
  4. 더한 값과 carry 값에 따라서 값 결정
  5. 결과 배열의 맨 앞까지 도달할 때까지 3, 4 번 과정 반복하기
  6. 결과 배열에 1 이 하나도 없다면 0 출력
  7. 결과 배열의 앞의 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));