총 N개의 시험장이 있고, 각각의 시험장마다 응시자들이 있다. i번 시험장에 있는 응시자의 수는 Ai명이다.
감독관은 총감독관과 부감독관으로 두 종류가 있다. 총감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 B명이고, 부감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 C명이다.
각각의 시험장에 총감독관은 오직 1명만 있어야 하고, 부감독관은 여러 명 있어도 된다.
각 시험장마다 응시생들을 모두 감시해야 한다. 이때, 필요한 감독관 수의 최솟값을 구하는 프로그램을 작성하시오.
첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다.
셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)
각 시험장마다 응시생을 모두 감독하기 위해 필요한 감독관의 최소 수를 출력한다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int room, main, sub;
long int result = 0;
cin >> room;
vector<int> v(room);
for (int i = 0; i < room; i++) {
cin >> v[i];
}
cin >> main >> sub;
for (int i = 0; i < room; i++) {
if (v[i] - main < 1) result += 1;
else if (v[i] - main > 0 && (v[i] - main) % sub == 0) result += (1 + (v[i] - main) / sub);
else result += (2 + (v[i]-main) / sub);
}
cout << result;
return 0;
}
얼마 전부터 백준 문제집에 올라와 있는 삼성 SW 역량 테스트 기출문제를 풀고 있는데, 그 중 가장 먼저 손을 댄 문제가 바로 이 13458번이다. 문제집 중 유일한 브론즈 문제 였어서 빨리 풀어버리려고 했던 건데 나의 얕은 지식으로 인해^^ 난관에 부딪혀 꽤나 시간을 쓴 문제였다.
새로운 언어를 배우게 되면 자료형의 종류, 크기, 범위 등을 초반에 배우게 되는데 이에 대한 중요성을 이해하지 못했다. 그냥 정수면 int 쓰고, 소수점 쓰고 싶으면 float 쓰면 되는거 아닌가?? 라고 생각했다 🙄 나의 이런 안일한 생각으로 13458번에서 아주 멋있는 삽질을 ... 하게 되었다.
이 문제의 입력값의 범위를 살펴보면 시험장의 개수(N)의 최댓값이 1,000,000개, 각 시험장의 응시자수(Ai)의 최댓값이 1,000,000명, 총감독관과 부감독관이 감시할 수 있는 응시자 수의 최댓값이 1,000,000명 이다.
따라서 시험장의 개수와 응시자 수가 최대값인 1,000,000이고 감시할 수 있는 인원은 각각 1명으로 최소인 경우 결과값이 최대가 되는데 그 값은 1,000,000 X 1,000,000 = 1,000,000,000,000 이다.
자, 그럼 C/C++의 자료형의 종류와 범위를 정리해보자.
종류 | 자료형 | 크기 (Byte) | 범위 |
---|---|---|---|
논리형 | bool | 1 | True(!0), False(0) |
문자 | (signed) char | 1 | -128 ~ 127 |
(unsigned) char | 1 | 0 ~ 255 | |
정수 | (signed) short | 2 | -32,768 ~ 32,767 |
(unsigned) short | 2 | 0 ~ 65,535 | |
(signed) int | 4 | -2,147,483,648 ~ 2,147,483,647 | |
(unsigned) int | 4 | 0 ~ 4,294,967,295 | |
(signed) long | 4 | -2,147,483,648 ~ 2,147,483,647 | |
(unsigned) long | 4 | 0 ~ 4,294,967,295 | |
(signed) long long | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
(unsigned) long long | 8 | 0 ~ 18,446,744,073,709,551,615 | |
실수 | float | 4 | 3.4E +/- 38 (7 digit) |
double | 8 | 1.7E +/- 308 (15 digit) | |
long double | 8 | 1.7E +/- 308 (15 digit) |
❓ int vs long
정리를 하고 나서 든 의문점! int와 long 모두 4byte이고 범위도 같은데 왜 이 문제에선 long을 쓰면 맞고, int를 쓰면 틀릴까?
알고보니 long int는 사용하는 컴파일러나 운영체제에 따라 4byte 혹은 8byte로 쓰인다고 한다. 일반적으로 32bit에선 4byte, 64bit에선 8byte로 사용되는데 윈도우의 경우 64bit OS에서도 long이 4byte 이다. 백준의 경우 long을 8byte로 인식하는 모양이다.
이번 문제를 통해 각 문제 조건에 따른 적절한 자료형을 선택하는 것이 중요하다는 것을 알게되었다. 또, int 범위를 초과하는 정수형의 경우 long 보다는 long long을 사용하는 편이 확실할 것 같다. 매번 백준을 풀며 느끼는 것이지만 아직 갈 길이 너-----무 멀다...^^ 파이팅 나 자신!!💪💪