이 문제는 추가적인 알고리즘을 학습할 필요는 없는 간단한 문제지만 헷갈릴 수 있는 부분들을 크게 두 파트로 나눠 정리했습니다.
1. 문제 자체를 이해할 때, 오해할 수 있는 부분들
1) 문제를 이해할 때 "각각의 시험장에 총감독관은 오직 1명만 있어야 한다"라는 부분이 0명도 된다는 것인지 무조건 1명이라는 것인지 헷갈릴 수 있습니다. 이 문제의 경우 "각각의 시험장에 총감독관이 반드시 1명 있어야 한다"로 해석하셔야 합니다.
2) 문제에서 필요한 감독관의 최소 수를 출력하라 해서, 자칫 경우의 수가 여럿 나오고 이를 모두 찾아 그중 가장 작은 값을 출력하는 문제라고 오해할 수 있습니다. 허나, 이 문제의 경우 최소공배수를 구할 때 모든 공배수를 구해서 구하지 않고 두 수를 공약수로 나누는 방법을 통해 한 번에 구할 수 있는 것과 같이 모든 경우의 수를 찾는 문제가 아닙니다. 최소인 경우를 바로 계산해서 이를 구하는 문제입니다.
2. 코드 작성 시에, 쉽게 할 수 있는 실수들의 원인
1) 컴파일 에러
=> 남은 응시생이 있어야 부 감독관이 들어가는데 이를 고려 안 했을 때 발생
(A[i]가 0보다 큰지 확인함으로써 남은 응시생이 있는지 확인하는 if문 안 넣었을 때)
2) 런타임 에러
=> 배열 A의 크기를 문제에서 주어진 조건인 1000000보다 여유 있게 정해주지 않았을 때 발생
3) 틀렸습니다
=> 전체 감독관의 수(sum)는 정수 범위를 초과할 수 있기 때문에 long long으로 선언해야 하는데 이를 int로 선언했을 때 발생
#include<iostream>#define ll long long
using namespace std;
int A[1000000];//각 시험장에 있는 응시자의 수int main(void)
{
int N;//시험장의 개수int B;//총 감독관이 감시할 수 있는 응시자의 수int C;//부 감독관이 응시할 수 있는 응시자의 수
ll sum = 0;//응시생을 모두 감독하기 위한 감독관의 수
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> A[i];
}
cin >> B >> C;
/*
각 시험장마다 필요한 부감독관의 수를 각각 구해 그 합을 구하는 반복문
*/for (int i = 0; i < N; i++)
{
A[i] -= B;//총감독관이 감독할 수 있는 학생 수 빼기(총감독관은 한 반에 한 명씩 들어가기 때문)/*
남은 학생들을 감독할 때 필요한 부감독관의 수 구함
*/if (A[i] > 0)//남은 학생들이 있다면
{
sum += A[i] / C;//남은 학생을 부감독관이 감독할 수 있는 학생 수로 나눠 필요한 부감독관의 수를 구해 총합에 더해줌if (A[i] % C != 0)//이때, 나머지가 있다면
{
sum++;//부감독관 한 명 더 필요함으로 총합을 1 늘려줌
}
}
}
cout << sum +N;//부감독관의 수에 총감독관의 수 더해서 출력//총감독관의 수는 이들이 각 시험장마다 반드시 한 명씩 들어가기 때문에 시험장의 개수인 N과 같다return 0;
}
Arduino
복사