본문 바로가기
Algorithm/BOJ

while문 편 - Node.js로 [백준/BOJ] 단계별로 풀어보기를 풀어보다

by Muko 2020. 4. 22.
728x90

안녕하세요! Muko입니다.

저번 포스팅에서 다루었던 for문에 이어서 이번에도 반복문을 다룰 수 있는 while문 편에 대해서 풀어보도록 하겠습니다. for문과 달리 while문은 제한 조건만을 괄호 안에 명시하고, 그 조건을 만족한다면 계속해서 반복 loop를 도는 특징이 있습니다. 반복문에 대해 잘 모르신다면, 혹은 조금 더 자세하게 공부하고나서 문제를 풀고 싶으시다면 반복문 포스팅을 보고 와주세요!



1. BOJ 10952 - A+B - 5

이 문제는 두 정수 A와 B를 입력받은 다음에, A+B를 출력하면 되는 문제이지만 조건이 하나 붙습니다. 입력이 여러 개의 테스트 케이스로 이루어져 있꼬, 입력의 마지막에는 0 두 개가 들어온다는 조건입니다. 즉, 우리는 입력을 계속해서 받다가 '0 0'이 들어오는 순간 프로그램을 종료되도록 코드를 짜야합니다.


이 문제는 javascript로 백준에서 풀 때는 for문으로 해결하는 것이 훨씬 쉽습니다만, while문으로 작성하는 연습을 해보도록 하겠습니다.

코드 접기/펼치기
// 입출력에 사용할 rl을 받아오는 함수
const getRl = () => {
  const readline = require('readline');
  return readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
}
const rl = getRl();

// 주어진 입력들을 이용해서 정답을 반환하는 함수
const getAnswers = (numbers) => {
  let answer = '';
  let index = 0;
  while(!(numbers[index][0] === '0' && numbers[index][1] === '0')){
    const A = parseInt(numbers[index][0]);
    const B = parseInt(numbers[index][1]);
    index++;
    answer += (A+B) + '\n';
  }
  return answer;
};

// 입력 받아와서 알고리즘 동작하는 함수
const input = [];
const start = (rl) => {
  rl.on('line', line => {
    input.push(line.split(' '));
  }).on('close', () => {
    console.log(getAnswers(input));
    process.exit();
  });
}

// 프로그램 동작
start(rl);




2. BOJ 10951 - A+B - 4

이 문제는 위의 문제와 달리 마지막 입력임을 나타내는 조건이 없이, 입력에 대한 결과만을 출력하라는 문제입니다. 풀이방법은 위와 비슷합니다.

코드 접기/펼치기
// 입출력에 사용할 rl을 받아오는 함수
const getRl = () => {
  const readline = require('readline');
  return readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
}
const rl = getRl();

// 주어진 입력들을 이용해서 정답을 반환하는 함수
const getAnswers = (numbers) => {
  let answer = '';
  let index = 0;
  while(index < numbers.length){
    const A = parseInt(numbers[index][0]);
    const B = parseInt(numbers[index][1]);
    index++;
    answer += (A+B) + '\n';
  }
  return answer;
};

// 입력 받아와서 알고리즘 동작하는 함수
const input = [];
const start = (rl) => {
  rl.on('line', line => {
    input.push(line.split(' '));
  }).on('close', () => {
    console.log(getAnswers(input));
    process.exit();
  });
}

// 프로그램 동작
start(rl);




3. BOJ 1110 - 더하기 사이클

위의 두 문제는 모두 해결하셨나요? 한 문제만 해결하면, 나머지 한 문제는 조금만 고민하면 바로 해결할 수 있는 문제라서 다른 포스팅에 비해 마지막 문제까지 금방 오셨을 것으로 생각됩니다.


이 문제는 주어진 숫자에 대해 문제에서 제시하는 조건에 따라 결과를 만들어내야 합니다. 이 문제에서 제시하는 조건은 1에서 99까지의 범위를 가지는 정수가 입력으로 들어왔을 때, 한 자리 숫자라면 앞에 0을 붙여서 두 자리 수로 만들고 각 자리 숫자를 더합니다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다고 합니다. 이렇게 반복했을 때 다시 원래 수로 돌아오는데 걸리는 연산 수를 구하라는 문제입니다.


이 문제는 입력으로 들어오거나, 계산하는 와중에 숫자를 각 자리수로 쪼갤 수 있어야하고, 원래 숫자와 동일하게 될 때까지 반복문을 돌리는 부분을 구현해야 해결할 수 있는 복잡한 문제입니다. 바로 아래의 답을 보지 마시고, 어떻게든 해결해보려고 노력하다보면 분명히 해결하실 수 있습니다! 지금까지 포스팅을 잘 따라오신 분이라면 본인이 아는 지식만으로 풀 수 있으니 조금만 더 도전해보세요!

코드 접기/펼치기
// 입출력에 사용할 rl을 받아오는 함수
const getRl = () => {
  const readline = require('readline');
  return readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
}
const rl = getRl();

// 주어진 숫자에 대해서 각 자리수의 합과 자리수의 가장 우측 숫자를 반환으로 결과 반환
const getPattern = (number) => {
  let inputNum = number;
  let digitsSum = 0;

  while(inputNum > 0){
    digitsSum += inputNum % 10;
    inputNum = parseInt(inputNum / 10);
  }

  return (number%10)*10 + (digitsSum%10); // 괄호 없어도 됨
}

// 주어진 입력을 이용해서 정답을 반환하는 함수
const getAnswer = (number) => {
  const originNum = number;
  let cnt = 1;
  let currentNum = getPattern(originNum);

  while(originNum !== currentNum){
    currentNum = getPattern(currentNum);
    cnt++;
  }
  return cnt;
};

// 입력 받아와서 알고리즘 동작하는 함수
const input = [];
const start = (rl) => {
  rl.on('line', line => {
    console.log(getAnswer(parseInt(line)));
  }).on('close', () => {
    process.exit();
  });
}

// 프로그램 동작
start(rl);




문제에서는 1에서 99까지라고 했기 때문에 위와 같은 방식으로 풀 필요는 없지만, 만약 자리 수가 달라질 수도 있을 경우에 대한 문제도 있을 수 있다는 생각에서 위와 같이 해결했습니다. 우리는 문제를 효율적으로 푸는 연습도 좋지만, 지금 이 난이도의 문제는 while문 자체에 익숙해지기 위함이기 때문이죠.



문제를 모두 다 풀으셨나요~? 이번에는 총 3개 밖에 되지 않아 금방 끝났습니다.
모두 수고하셨습니다 :)

728x90

댓글