백준 13458번 - 시험 감독

이동준·2021년 9월 20일
0

백준 13458번
처음 풀이 코드

#include <iostream>
using namespace std;

int main()
{
	int N;
	int b, c;
	int main_supervisor = 1;
	int assist_supervisor = 0;
	cin >> N;
	int* a = new int[N];

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

	for (int i = 0; i < N; i++) {
		a[i] = a[i] - b;
			if (a[i] % c == 0)
				assist_supervisor += a[i] / c;
			else
				assist_supervisor += a[i] / c + 1;
	}
	
	cout << main_supervisor * N + assist_supervisor;

위와 같이 코드를 만들고 예제 5개 전부 결과가 잘 나오길래 바로 제출했는데 '실패했습니다'가 떠서 무엇인지 고민하다가 2가지 중요한 점을 알게 되었습니다.

Test set에서는 없지만 고려해야 하는 부분

Test set에서는 시험장 학생수 < 주감독자 감독가능 수 인 경우가 없었지만 이를 고려해야 했음을 알 수 있다.

입력 변수의 크기와 출력 변수의 크기 고려

N(1 ≤ N ≤ 1,000,000), A[i] (1 ≤ A[i] ≤ 1,000,000),(1 ≤ B, C ≤ 1,000,000)
입력 변수가 위와 같으므로 출력 변수 또한 최대로 고려한다면 주 감독관의 경우에만 해도 10^6 * 10^6 =10^12 까지 나올 수 있으므로 이 크기를 저장할 수 있는 변수 타입이 필요하므로 답과 관계된 변수를 long long 변수 타입으로 했어야 했다

Refactoring
위 2가지 고려사항을 고려해서 코드를 java로 다시 짜보았다


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Main {
    static int N;
    static int[] A;
    static int B,C;
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        long assistant=0;

        N=Integer.parseInt(br.readLine());

        A=new int[N];
        st=new StringTokenizer(br.readLine());
        for(int i=0; i<N; i++){
            A[i]=Integer.parseInt(st.nextToken());
        }

        st=new StringTokenizer(br.readLine());
        B=Integer.parseInt(st.nextToken());
        C=Integer.parseInt(st.nextToken());

        // 부 감독관 수 계산
        for(int i=0; i<N; i++){
            if(A[i]>B){
                int r=(A[i]-B)%C;
                if(r==0) assistant+=(A[i]-B)/C;
                else assistant+=(A[i]-B)/C+1;
            }
        }
        System.out.println(N+assistant);
    }
}

결론

  1. 알고리즘을 구성할 때 모든 가능한 경우들을 고려하자
  2. 입력 변수의 크기를 바탕으로 출력 변수 크기를 고려해서 변수 타입을 설정하자
profile
PS 블로그/Java 풀이 + 코딩테스트 정리

0개의 댓글