1번 구구단
문제
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.
입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.
출력
출력형식과 같게 N*1부터 N*9까지 출력한다.
반복문을 사용하는 문제가 시작되었다. 입력받은 N 값을 1부터 9까지 차례로 곱하고 결과를 출력한다.
출력 형식은
n * 1 = n
n * 2 = 2n
...
n* 9 = 9n
C++
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
for(int i = 1; i < 10; i++){
cout << n << " * " << i << " = "<< n * i << endl;
}
return 0;
}
띄어쓰기와 줄 바꿈 등 출력 형식에 주의한다.
C#
using System;
class Program{
static void Main(string[] args){
string input = Console.ReadLine();
int n = int.Parse(input);
for (int i = 1; i < 10; i++){
int result = n * i;
Console.WriteLine($"{n} * {i} = {result}");
}
}
}
Python
inputStr = input()
n = int(inputStr);
for i in range(1, 10):
print(f"{n} * {i} = {n*i}");
파이썬의 반복문 for i in range()를 사용한다.
range는 i의 범위로 range(1, 10) 은 i는 1부터 i < 10까지 증가하면서 반복된다.
Node.js
const readline = require('readline');
const rl = readline.createInterface({
input : process.stdin,
output : process.stdout
});
rl.question('', (answer)=>{
let n = parseInt(answer);
for(let i = 1; i < 10; i++){
console.log(`${n} * ${i} = ${n*i}`);
}
rl.close();
});
템플릿 리터럴 사용 숙지하기 `` 백틱 내부에서 변수는 ${var}로 문자열과 혼합 표기하면 된다.
반복문에서 i 선언 시 let을 사용해야 한다.
2번 A+B-3
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
각 테스트 케이스마다 A+B를 출력한다.
처음 입력은 반복 횟수, 다음 줄부터는 A, B의 입력이 한 줄씩 묶어서 여러 묶음이 들어온다.
배열과 반복문을 잘 사용해야 할 것 같다. 그런데 제목에는 -3이 있는데 문제와 상관이 없어 보인다.
C++
#include <iostream>
using namespace std;
int main(){
int count;
cin >> count;
for (int i = 0; i < count; i++){
int a, b;
cin >> a >> b;
cout << a + b << endl;
}
return 0;
}
입력받은 값만큼 반복을 한다.
반복할 때마다 두 번의 입력을 처리해서 출력하고 다음 루프를 진행한다.
C#
using System;
class Program{
static void Main(string[] args){
int count = int.Parse(Console.ReadLine());
for (int i = 0; i < count; i++){
string input = Console.ReadLine();
string[] inputArr = input.Split(' ');
int a = int.Parse(inputArr[0]);
int b = int.Parse(inputArr[1]);
Console.WriteLine(a+b);
}
}
}
문제에서 입력이 한 줄씩 들어온다는 점과 Console.ReadLine이 한 줄씩 처리한다는 걸 이해하면 간단하다.
이 방법은 반복 횟수가 확정되어 있기 때문에 가능하며 각 줄을 입력받고 연산해서 출력하고 다음 줄로 넘어가는 방식이다.
Python
count = int(input())
for i in range(count):
inputStr = input()
arr = inputStr.split(' ')
a = int(arr[0])
b = int(arr[1])
print(f"{a + b}")
range에 인수를 하나만 넣으면 i = 0부터 시작해서 < count까지 반복한다.
input은 문자열이기 때문에 int로 변환해 주는 걸 유의한다.
오답
const readline = require('readline');
const rl = readline.createInterface({
input : process.stdin,
output : process.stdout
});
rl.question('', (answerCount)=>{
const count = parseInt(answerCount);
for (let i = 0; i < count; i++){
rl.question('', (case)=>{
const [a, b] = case.split(' ').map(Number);
console.log(a + b);
});
};
rl.close();
});
rl.question 은 비동기 함수라서 반복문 안에서 이를 실행시키면 각 케이스가 독립적으로 처리되지 않기 때문에 위 코드는 제대로 동작하지 않는다.
그리고 case는 이미 사용 중인 키워드이기 때문에 이름을 다른 걸 써야 한다.
const readline = require('readline');
const rl = readline.createInterface({
input : process.stdin,
output : process.stdout
});
rl.question('', (answerCount)=>{
const count = parseInt(answerCount);
const results = [];
let index = 0;
const ask = ()=>{
if (index < count){
rl.question('', (caseInput) =>{
const [a, b] = caseInput.split(' ').map(Number);
results.push(a+b);
index++;
ask();
});
} else{
results.forEach(result=> console.log(result));
rl.close();
}
};
ask();
});
오답 코드를 개선하여 한 번에 하나씩 케이스를 처리하고, 모든 질문이 완료되면 question을 종료하고 결과를 출력한다.
ask 메서드를 변수로 선언하여 각 케이스마다 처리한 결과를 results에 저장해 두고 이 함수를 재귀적으로 호출한다.
count까지의 횟수를 체크하기 위해서 index를 사용하여 현재 진행된 반복 횟수를 체크하고 모든 반복이 끝났을 때 저장해 둔 results의 요소들을 모두 출력한다.
그리고 이 동작을 실행시키기 위해서 한 번 ask를 실행시켜주어야 한다.
더 간단한 방법을 찾아보니 process.stdin을 활용하면 전체 입력을 한 번에 읽고 처리할 수 있는 방법이 있었다.
const readline = require('readline');
const rl = readline.createInterface({
input : process.stdin,
output : process.stdout
});
let input = [];
rl.on('line', (line)=>{
input.push(line);
}).on('close', () => {
const count = parseInt(input[0]);
for (let i = 1; i <= count; i++){
const [a, b] = input[i].split(' ').map(Number);
console.log(a + b);
}
process.exit(0);
});
input 배열을 선언하고
rl.on('line; ~ 각 줄을 입력받을 때마다 input에 저장한다.
rl.on('close' ~ 입력이 종료되면 반복문으로 input에 저장된 값들을 처리한다.
처음 입력 값인 count 만큼 반복을 실행하며 이를 제외한 i = 1부터 인덱스를 순회한다.
1부터 시작되는 input 에는 케이스들이 저장되어 있기 때문에 이 요소를 공백으로 구분하고 맵으로 만들어서 출력해 주면 된다.
앞서 풀었던 문제들도 이렇게 풀면 더 간단했던 문제도 있던 거 같았는데 이번에 이 기능들을 제대로 파악하고 가야겠다.
3번 합
문제
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.
출력
1부터 n까지 합을 출력한다.
n까지의 합계를 구하는 문제이다.
수학 공식을 활용하면 간단하게 n * (n + 1) / 2의 결과와 동일하다.
C++
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int result = 0;
for (int i = 1; i <= n; i++){
result += i;
}
cout << result;
return 0;
}
먼저 문제의 주제에 맞게 반복문을 사용하여 처리해 본다.
수학 공식으로 처리해도 동일한 결과라는 것을 확인한다.
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int result = n * (n + 1) / 2;
cout << result;
return 0;
}
반복문 챕터이기 때문에 공식은 아껴두고 반복문으로만 풀어보도록 한다.
C#
using System;
class Program{
static void Main(string[] args){
int n = int.Parse(Console.ReadLine());
int result = 0;
for (int i = 1; i <= n; i++){
result += i;
}
Console.WriteLine(result);
}
}
Python
n = int(input())
result = 0
for i in range(1, n+1):
result += i
print(result);
Node.js
const fs = require('fs');
const n = parseInt(fs.readFileSync('dev/stdin').toString().trim());
let result = 0;
for (let i = 1; i <= n; i++){
result += i;
}
console.log(result);
'Coding Test' 카테고리의 다른 글
백준 코딩테스트 #15. 반복문 6 (0) | 2024.08.01 |
---|---|
백준 코딩테스트 #14. 반복문 (4, 5) (0) | 2024.07.31 |
백준 코딩테스트 #12. 조건문 7 (0) | 2024.07.26 |
백준 코딩테스트 #11. 조건문 6 (0) | 2024.07.26 |
백준 코딩테스트 #10. 조건문 5 (0) | 2024.07.26 |