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으로 써야 하는 걸 유의한다.
'Coding Test' 카테고리의 다른 글
백준 코딩테스트 #16. 반복문 (7~10) (0) | 2024.08.01 |
---|---|
백준 코딩테스트 #15. 반복문 6 (0) | 2024.08.01 |
백준 코딩테스트 #13. 반복문 (1 ~ 3) (0) | 2024.07.29 |
백준 코딩테스트 #12. 조건문 7 (0) | 2024.07.26 |
백준 코딩테스트 #11. 조건문 6 (0) | 2024.07.26 |