STUDY/코딩테스트 연습(PS)

백준/13458번, 시험 감독(연산)/C++

hyunah 2021. 4. 19. 12:06

 

시험장마다 한 명의 총감독관과 여러 명의 부감독관이 있을 수 있을 때, 응시생을 모두 감시하는 데에 필요한 최소 감독관 수를 구하는 간단한 연산 문제이다.

 

 

주의할 점

 

1. 빼기의 반복은 나누기이다.

2. 최대범위를 고려하여 데이터타입을 정하자.

 

 

#include <iostream>
#include <cstdio>
#define MAX 1000000

using namespace std;

int N, B, C;
int p[MAX];

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int x = 0;
	long long sum = 0;

	cin >> N;

	for (int i = 0; i < N; i++) {
		cin >> p[i];
	}

	cin >> B >> C;

	for (int i = 0; i < N; i++) {
		sum++;
		p[i] -= B;

		if (p[i] > 0) {
			sum += ((p[i] - 1) / C + 1);
		}
	}

	cout << sum;
}

 

 

디버깅 기록

 

1. 필요한 총감독관의 수를 구할 때는 굳이 p[i]값이 0인지 확인할 필요가 없다. 어차피 조건에서 최소 응시생 범위는 1이기 때문. 그리고 총감독관은 꼭 1명이 있어야 하므로 먼저 따로 계산을 해주었다.

 

2. 필요한 부감독관의 수를 구할 대, 처음에 p[i] / C + 1 의 값을 sum에 더해서, p[i]가 나누어 떨어지는 경우에 잘못된 값이 출력되었다. 저번에 익혔던 스킬을 떠올려서, 기존 값에서 1을 빼고 나눈 후 몫값에 1을 더해주는 위의 식으로 바꾸었다.  

 

3. 최대범위를 고려 안 하고 sum도 int형으로 설정했다가 틀렸다고 나와서 long long으로 수정하였다. 최대범위는 항상 조심 또 조심..

 

 

* 처음에는 벡터를 사용했는데 다른 사람 코드에 비해 메모리도 많이 쓰고 시간도 오래 걸려서 배열로 바꾼 후에 cin,cout 속도도 줄이니 비슷한 성능이 나왔다.