안녕하세요! 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개 밖에 되지 않아 금방 끝났습니다.
모두 수고하셨습니다 :)
댓글