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

7번 주사위 세 개

문제

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다. 같은 눈이 3개가 나오면 10,000원+(같은 눈) ×1,000원의 상금을 받게 된다. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈) ×100원의 상금을 받게 된다. 모두 다른 눈이 나오는 경우에는 (그중 가장 큰 눈) ×100원의 상금을 받게 된다. 예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3 ×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2 ×1,000으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6 ×100으로 계산되어 600원을 상금으로 받게 된다. 3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성하시오.

 

입력

첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.

 

출력

첫째 줄에 게임의 상금을 출력한다.

 

입력받은 주사위 눈을 조건에 맞게 검사해서 상금을 출력하면 된다.

 

C++

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    int a, b, c;
    cin >> a;
    cin >> b;
    cin >> c;
    int reward;
    if (a == b && b == c){
        reward = 10000 + a * 1000;
    }
    else if (a == b || b == c || a == c){
        int val = a == b ? a : b == c ? b : c;
        reward =  1000 + val * 100;
    }
    else{
        int max_val = max({a, b, c});
        reward = max_val * 100;
    }
    cout << reward;
    return 0;
}

 

세 개의 값 중 가장 큰 값을 구할 때 <algorithm> 헤더의 std::max를 사용하여 간략하게 작성한다.

 

C#

using System;
class Program{
    static void Main(string[] args){
        string input = Console.ReadLine();
        string[] arr_input = input.Split(' ');
        int a = int.Parse(arr_input[0]);
        int b = int.Parse(arr_input[1]);
        int c = int.Parse(arr_input[2]);
        int reward;
        if (a == b && b == c){
            reward = 10000 + a * 1000;
        }
        else if (a == b || b == c || a == c){
            int val = a == b ? a : b == c ? b : c;
            reward = 1000 + val * 100;
        }
        else {
            int val = Math.Max(a, (Math.Max(b, c)));
            reward = 100 * val;
        }
        Console.WriteLine(reward);
    }
}

 

C#은 최댓값을 구하기 위해서 Math.Max를 중첩해서 사용했다.

 

다른 방법으로는 System.Linq의 Enumerable.Max를 사용할 수  있다.

using System.Linq;
~

	int [] nums = {a, b, c};
	int max_val = nums.Max();

~

 

두 방식을 비교해 보니 메모리면에서 전자의 방법이 더 나았다.

 

Python

inputData = input();
arrData = inputData.split(' ');
a = int(arrData[0]);
b = int(arrData[1]);
c = int(arrData[2]);
if a == b and b == c:
    reward = 10000 + a * 1000
elif a == b or b == c or a == c:
    val = a if a == b or a == c else b
    reward = 1000 + val * 100;
else:
    val = max(a, b, c)
    reward = 100 * val
print(reward)

 

파이썬에서 삼항 연산자는 if - else로 표현된다.

max 함수는 가장 큰 수를 반환한다.

 

Node.js

const readline = require('readline');
const rl = readline.createInterface({
    input : process.stdin,
    output : process.stdout
});

rl.question('', (answer)=>{
    const [a,b,c] = answer.split(' ').map(Number);
    let reward;
    if (a == b && b == c){
        reward = 10000 + a * 1000;
    }
    else if (a == b || b == c || a == c){
        let val = a == b ? a : b == c ? b : c;
        reward = 1000 + val * 100;
    }
    else{
        val = Math.max(a, b, c);
        reward = 100 * val;
    }
    console.log(reward);
    rl.close();
});

 

node.js는 Math.max로 세 값 중 가장 큰 값을 구할 수 있다.

728x90
반응형

6번 오븐 시계

문제

KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다. 인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다. 그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 분 단위로 자동적으로 계산한다. 또한, KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털시계가 있다. 훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.

 

입력
첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23)와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.

 

출력

첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)

 

훈제오리구이 맛있겠다.

입력은 두 번 들어오고 처음에 현재 시각, 두 번째 조리에 필요한 시간이다.

종료되는 시간은 현재 시각에서 조리 시간을 더한 결과이다. 주의할 점은 조리에 필요한 값은 분 단위로 들어온다는 것으로 이를 시간과 분으로 구분하는 게 계산하기 편할 것 같다.

 

C++

#include <iostream>
using namespace std;
int main(){
    int currH, currM, needM;
    cin >> currH;
    cin >> currM;
    cin >> needM;
    int endH, endM;
    int needH = needM / 60;
    needM = needM - needH * 60;
    endH = currH + needH;
    endM = currM + needM;
    if (endM >= 60){
        endM = endM - 60;
        endH++;
    }
    if (endH >= 24)
        endH = endH - 24;
    cout << endH << " " << endM;
    return 0;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        string input_first = Console.ReadLine();
        string input_second = Console.ReadLine();
        string[] arr_input_first = input_first.Split(' ');
        int currH = int.Parse(arr_input_first[0]);
        int currM = int.Parse(arr_input_first[1]);
        int needM = int.Parse(input_second);
        int endH, endM;
        int needH = needM / 60;
        needM = needM % 60;
        endH = currH + needH;
        endM = currM + needM;
        if (endM >= 60){
            endM = endM - 60;
            endH++;
        }
        if (endH >= 24)
            endH = endH - 24;
        Console.WriteLine($"{endH} {endM}");
    }
}

 

조리시간을 시간과 분으로 구분할 때 분은 몫으로 계산하면 간략하게 표현할 수 있다.

 

Python

inputFirst = input();
inputSecond = input();
arrInputFirst = inputFirst.split(' ');
currH = int(arrInputFirst[0]);
currM = int(arrInputFirst[1]);
needM = int(inputSecond);
needH = needM // 60;
needM = needM % 60;
endH = currH + needH;
endM = currM + needM;
if endM >= 60:
    endM -= 60
    endH += 1
if endH >= 24:
    endH -= 24
print(endH, endM)

 

파이썬 사용 시 정수 나눗셈에 유의한다. '//'

그리고 증감 연산자 '++' , '--'는 사용하지 못한다.

 

Node.js

const readline = require('readline');
const rl = readline.createInterface({
    input : process.stdin,
    output : process.stdout
});
rl.question('', (answer_first)=>{
    const [currH, currM] = answer_first.split(' ').map(Number);
    rl.question('', (answer_second)=>{
        let needM = parseInt(answer_second);
        let needH = Math.floor(needM / 60);
        needM = needM % 60;
        let endH = currH + needH;
        let endM = currM + needM;
        if (endM >= 60){
            endM -= 60;
            endH++;
        }
        if (endH >= 24){
            endH -= 24;
        }
        console.log(`${endH} ${endM}`);
        rl.close();
    });
});

 

endH의 초기값을 구할 때 Math.floor를 사용해서 정수값을 구한다.

 

728x90
반응형

+ Recent posts