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
반응형

+ Recent posts