4번 영수증

문제

준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다. 

영수증에 적힌, 

 

- 구매한 각 물건의 가격과 개수

- 구매한 물건들의 총금액

 

을 보고, 구매한 물건의 가격과 개수로 계산한 총금액이 영수증에 적힌 총금액과 일치하는지 검사해 보자.

 

입력

첫째 줄에는 영수증에 적힌 총금액 X가 주어진다. 

둘째 줄에는 영수증에 적힌 구매한 물건의 종류의 수 N이 주어진다. 

이후 N개의 줄에는 각 물건의 가격 a와 개수 b가 공백을 사이에 두고 주어진다.

 

출력

구매한 물건의 가격과 개수로 계산한 총금액이 영수증에 적힌 총금액과 일치하면 Yes를 출력한다. 일치하지 않는다면 No를 출력한다.

 

제한

- 1 ≤ X ≤ 1,000,000,000

- 1 ≤ N ≤ 100

- 1 ≤ a ≤ 1,000,000

- 1 ≤ b ≤ 10

 

첫째 입력 영수증에 적힌 총금액 X, 

두 번째 입력 물건의 종류의 수 N,

이후 각 물건의 가격 a, 개수 b 입력된다.

 

N번 반복문을 돌려서 각 물건의 개수와 가격을 합산하여 X와 비교하여 Yes 또는 No를 출력하면 된다.

 

C++

#include <iostream>
using namespace std;
int main(){
    int total_price;
    int total_count;
    int result = 0;
    cin >> total_price >> total_count;
    for (int i = 0; i < total_count; i++){
        int a, b;
        cin >> a >> b;
        result += a * b;
    }
    if (total_price == result){
        cout << "Yes";
    }
    else cout << "No";
    return 0;
}

 

result 변수 += 연산자 사용 전 값 초기화 필요

 

C#

using System;
class Program{
    static void Main(string[] args){
        int total_price = int.Parse(Console.ReadLine());
        int total_count = int.Parse(Console.ReadLine());
        int result = 0;
        for (int i = 0; i < total_count; i++){
            string input = Console.ReadLine();
            string[] arr = input.Split(' ');
            int a = int.Parse(arr[0]);
            int b = int.Parse(arr[1]);
            result += a * b;
        }
        if (result == total_price){
            Console.WriteLine("Yes");
        }
        else{
            Console.WriteLine("No");
        }
    }
}

 

Python

total_price = int(input())
total_count = int(input())
result = 0;
for i in range(total_count):
    str = input()
    arr = str.split(' ')
    a = int(arr[0])
    b = int(arr[1])
    result += a * b
if result == total_price:
    print("Yes")
else:
    print("No")

 

Node.js

const readline = require('readline');
const rl = readline.createInterface({
    input : process.stdin,
    output : process.stdout
});
let input = [];
let result = 0;
rl.on('line', (line) => {
    input.push(line);
}).on('close', () => {
    const total_price = parseInt(input[0]);
    const total_count = parseInt(input[1]);
    for(let i = 2; i < total_count + 2; i++){
        const[a,b] = input[i].split(' ').map(Number);
        result += a * b;
    }
    if (result === total_price){
        console.log("Yes");
    }else{
        console.log("No");
    }
});

 

모든 입력을 저장하고 인덱스로 끊어서 처리한다.

 

여기서 루프는 처음과 두 번째 값으로 2부터 시작하기 때문에 total_count +  2를 해주어야 전체 값을 처리할 수 있다.

 

5번 코딩은 체육과목입니다.

문제

오늘은 혜나의 면접 날이다. 면접 준비를 열심히 해서 앞선 질문들을 잘 대답한 혜아는 이제 마지막으로 칠판에 직접 코딩하는 문제를 받았다. 

 

혜아가 받은 문제는 두 수를 더하는 문제였다. C++ 책을 열심히 읽었던 혜아는 간단히 두 수를 더하는 코드를 칠판에 적었다. 코드를 본 면접관은 다음 질문을 했다. 

 

“만약, 입출력이 $N$바이트 크기의 정수라면 프로그램을 어떻게 구현해야 할까요?” 

 

혜아는 책에 있는 정수 자료형과 관련된 내용을 기억해 냈다. 책에는 long int는 4바이트 정수까지 저장할 수 있는 정수 자료형이고 long long int는 8바이트 정수까지 저장할 수 있는 정수 자료형이라고 적혀 있었다.

 

혜아는 이런 생각이 들었다. “int 앞에 long을 하나씩 더 붙일 때마다 4바이트씩 저장할 수 있는 공간이 늘어나는 걸까? 분명 long long long int는 12바이트, long long long long int는 16바이트까지 저장할 수 있는 정수 자료형일 거야!” 그렇게 혜아는 당황하는 면접관의 얼굴을 뒤로한 채 칠판에 정수 자료형을 써 내려가기 시작했다. 혜아가 N바이트 정수까지 저장할 수 있다고 생각해서 칠판에 쓴 정수 자료형의 이름은 무엇일까?

 

입력

첫 번째 줄에는 문제의 정수 N이 주어진다. (4 N   1, 000; N은 4의 배수)

 

출력

혜아가 N바이트 정수까지 저장할 수 있다고 생각하는 정수 자료형의 이름을 출력하여라.

 

일리가 있는 생각이다. 혜아는 long이 붙을 때마다 4바이트씩 늘어난다고 생각하여 N바이트를 저장하려면 N/4 * long을 사용하면 N 바이트를 저장할 수 있을 것이라도 추론했다.

 

여기서 N%4가 0이 아니면 N/4 + 1을 해주어야 할 것이지만 N은 4의 배수라고 하니 따로 처리할 필요는 없을 것 같다.

 

물론 실제로는 long long int 까지만 존재하며 그 이상의 크기의 정수를 사용하기 위해서는 __int128_t 또는 gmp 같은 라이브러리를 사용해야 한다. __int128_t는 128비트 정수 자료형으로 16바이트 즉, long long long long int 만큼의 정수를 사용할 수 있다. gmp는 임의 정밀도 연산을 지원하는 라이브러리로 이론적으로 메모리가 허용하는 한 무한히 큰 숫자를 저장할 수 있다.

__int128_t는 <stdint> gmp는 <gmp.h>

 

C++

#include <iostream>
#include <string>
using namespace std;
int main(){
    int n;
    cin >> n;
    int count = n/4;
    string result;
    for (int i = 0; i < count; i++){
        result += "long ";
    }
    result += "int";
    cout << result;
    return 0;
}

 

C#

using System;
class Program{
    static void Main(string[] args){
        int n = int.Parse(Console.ReadLine());
        string result = "";
        int count = n / 4;
        for (int i = 0; i < count; i++){
            result += "long ";
        }
        result += "int";
        Console.WriteLine(result);
    }
}

 

C++의 경우 string 선언 시 빈 문자열로 초기화가 되지만 C#은 null로 초기화되기 때문에 바로 += 연산을 사용하기 위해서는 빈문자열로 초기화해 주는 게 필요하다.

 

Python

n = int(input())
result = "";
for i in range(n//4):
    result += "long "
result += "int"
print(result)

 

몫을 정확히 구하기 위해서 // 을 사용해야 한다.

 

Node.js

const readline = require('readline');
const rl = readline.createInterface({
    input : process.stdin,
    output : process.stdout
});
rl.question('', (answer)=>{
    const n = parseInt(answer);
    let result = "";
    for (let i = 0; i < n / 4; i++){
        result += "long ";
    }
    result += "int";
    console.log(result);
    rl.close();
});

 

자바스크립트에서 습관적으로 for 문의 변수를 int로 선언하게 되는데 let으로 써야 하는 걸 유의한다.

 

 

728x90
반응형

+ Recent posts