본문 바로가기
Coding/Coding Test

백준 코딩테스트 #13. 반복문 (1 ~ 3)

by lover_duck 2024. 7. 29.
728x90
반응형

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);

 

728x90
반응형