[BAEKJOON] 10952번 A+B(5)

JU CHEOLJIN·2021년 7월 14일
3

Algorithm

목록 보기
7/16
post-thumbnail

10952번 A+B - 5

문제

두 정수 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);
 }

온갖 원인을 찾다가 이 코드 저 코드 다 바꿔보게 됐는데 그 중에서 마음에 들지 않았던 부분들도 깔끔하게 정리했더니 정답이 나온 것이다. ✨ 예를 들어서 변수 num1num2 를 선언하는 부분을 굳이 반복문 밖으로 빼고 구체적인 값으로 할당할 필요가 없었다. 그래서 이해하기 쉽게 반복문 안으로 넣고 i 값에 따라 인덱스를 바꿔가면서 원하는 값을 호출할 수 있도록 했다. 처음에는 별로 바꾼 것도 없는데 왜 정답이 나와? node.js 가 백준에서 조금 이상하다던 소문이 있던데 이건가? 하는 바보 같은 생각을 했다. 하지만, 바보는 나였고...🥲 자연스럽게 코드를 다시 작성하다보니 불행의 씨앗 inputs 을 쓰지 않았다.

성격이 찝찝한 것을 싫어하기 때문에 틀린 코드와 맞은 코드를 보면서 10분은 더 고민하고 나서야 inputs 의 오타가 나를 괴롭혔다는 것을 알 수 있었다. (저 같은 사람은 없겠지만 여러분! 오타부터 꼭 살펴보세요 ㅠㅠ🥲)

아무튼 간단하게 이 문제에 대해서 이야기를 하고 마무리 하자면, while 을 자유롭게 반복시키고 break 시킬 수 있는지. 그리고 여러 줄로 들어오는 입력 '1 1' 등을 원하는 대로 변환해서 사용할 수 있는지가 중요한 문제였다.

이를 해결하기 위해서 split(" ") 을 통해서 길이가 2인 배열로 변환했고 배열의 각 인덱스 [0], [1] 의 값들이 num1, num2 에 할당되도록 했다. 조건으로 "0 0" 이 들어오는 경우에는 멈춰야 했으므로 if문 을 통해서 break 를 줬다.

백준의 알고리즘을 풀면서 들었던 생각은 입력값이 들어오는 방식에 대해서 생각을 잘 해야한다는 것이다. 아마, 이런 연습은 나중에 문제해결을 해나가는 측면에서도 작은 도움이 되지 않을까?💪

profile
사회에 도움이 되는 것은 꿈, 바로 옆의 도움이 되는 것은 평생 목표인 개발자.

4개의 댓글

comment-user-thumbnail
2021년 7월 14일

문제를 통해 while문을 어떤식으로 적용해야하는지 알게되었습니다! 감사합니다ㅎ.ㅎ

1개의 답글
comment-user-thumbnail
2021년 7월 15일

while문 사용법을 깨우쳐주셔서 어제 3문제를 while로 다 풀어버렸네요..ㅎㅎ 덕분에 이제 while은 두렵지 않습니다!!

1개의 답글