두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
입력의 마지막에는 0 두 개가 들어온다.
각 테스트 케이스마다 A+B를 출력한다.
const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString().trim().split('\n');
let num1 = Number(inputs[0].split(" ")[0]); // 처음 들어갈 값 선언
let num2 = Number(inputs[0].split(" ")[1]); // 처음 들어갈 값 선언
let i = 1; // num1, num2 에 이미 index 0을 할당했으므로 1부터 시작
while (true) { // break 를 만나기 전까지는 계속 반복
if (num1 === 0 && num2 === 0) {
break; // 0 0 값이 들어오면 멈춰야 함.
}
console.log(num1 + num2);
num1 = Number(inputs[i].split(" ")[0]);
num2 = Number(inputs[i].split(" ")[1]);
i++; // index 를 1씩 늘려서 반복문을 돌리기 위해서
}
처음에는 위처럼 고민을 해서 제출을 했다. 실제로 vscode
를 통해서 출력값을 받아보니 예시와 동일하게 나와서 맞았을 거라 생각했다. 그런데 제출하고 보니까...
무수한 런타임 에러를 만나게 됐다. 위에서 출력초과
같은 경우에는 입력값을 받는 과정에서 앞과 뒤의 개행을 없애주는 trim()
을 추가해서 수정했지만 계속 되는 런타임 에러
에 온갖 고민을 하고 고쳤다. fs모듈
의 문제인가 싶어서 readline 모듈
을 사용하기도 하고 코드의 구조를 바꾸기도 하고 했는데 안되서 속상해하고 있었는데... 정답은 아주 간단했다. vscode
로 돌려보기 위해서 임의로 inputs
를 변수를 만들어서 테스트를 했었는데 제출을 하는 과정에서 이를 수정하지 않았던 것이다. ReferenceError
에 집중을 해서 변수 이름 등을 살펴봤다면 빠르게 고칠 수 있는 문제였다. 심지어... 오타를 발견하게 된 계기도 민망하다.
// 최종 제출했던 코드
const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString().trim().split('\n');
let i = 0;
while (true) {
let num1 = Number(input[i].split(" ")[0]);
let num2 = Number(input[i].split(" ")[1]);
// split(" ")으로 ['1', '1'](i=0) 배열 받고 각 변수에 할당
i++; // index 0부터 1 증가시키며 반복
if (num1 === 0 && num2 === 0) {
break; // "0 0" 입력이 들어오는 경우 멈추기
}
console.log(num1 + num2);
}
온갖 원인을 찾다가 이 코드 저 코드 다 바꿔보게 됐는데 그 중에서 마음에 들지 않았던 부분들도 깔끔하게 정리했더니 정답이 나온 것이다. ✨ 예를 들어서 변수 num1
과 num2
를 선언하는 부분을 굳이 반복문 밖으로 빼고 구체적인 값으로 할당할 필요가 없었다. 그래서 이해하기 쉽게 반복문 안으로 넣고 i
값에 따라 인덱스를 바꿔가면서 원하는 값을 호출할 수 있도록 했다. 처음에는 별로 바꾼 것도 없는데 왜 정답이 나와? node.js
가 백준에서 조금 이상하다던 소문이 있던데 이건가? 하는 바보 같은 생각을 했다. 하지만, 바보는 나였고...🥲 자연스럽게 코드를 다시 작성하다보니 불행의 씨앗 inputs
을 쓰지 않았다.
성격이 찝찝한 것을 싫어하기 때문에 틀린 코드와 맞은 코드를 보면서 10분은 더 고민하고 나서야 inputs
의 오타가 나를 괴롭혔다는 것을 알 수 있었다. (저 같은 사람은 없겠지만 여러분! 오타부터 꼭 살펴보세요 ㅠㅠ🥲)
아무튼 간단하게 이 문제에 대해서 이야기를 하고 마무리 하자면, while
을 자유롭게 반복시키고 break
시킬 수 있는지. 그리고 여러 줄로 들어오는 입력 '1 1'
등을 원하는 대로 변환해서 사용할 수 있는지가 중요한 문제였다.
이를 해결하기 위해서 split(" ")
을 통해서 길이가 2인 배열로 변환했고 배열의 각 인덱스 [0]
, [1]
의 값들이 num1
, num2
에 할당되도록 했다. 조건으로 "0 0"
이 들어오는 경우에는 멈춰야 했으므로 if문
을 통해서 break
를 줬다.
백준의 알고리즘을 풀면서 들었던 생각은 입력값이 들어오는 방식에 대해서 생각을 잘 해야한다는 것이다. 아마, 이런 연습은 나중에 문제해결을 해나가는 측면에서도 작은 도움이 되지 않을까?💪
문제를 통해 while문을 어떤식으로 적용해야하는지 알게되었습니다! 감사합니다ㅎ.ㅎ