기록하는 습관을 들이자

[ 백준 13458 시험 감독 ] 문제 풀이(Java) - 삼성SW역량테스트 기출 본문

알고리즘/BOJ

[ 백준 13458 시험 감독 ] 문제 풀이(Java) - 삼성SW역량테스트 기출

myeongmy 2020. 4. 8. 20:33
반응형

처음에 이 문제를 보고 

 

브론즈 2레벨인데 왜 정답률이 25%밖에 안돼지?라고 생각했는데 실수하기 쉬운 부분이 있었습니다!

 

 

문제보기

https://www.acmicpc.net/problem/13458

 

13458번: 시험 감독

첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)

www.acmicpc.net

 

나의 풀이

 

수학 나머지 연산(%)을 이용하면 간단하게 풀 수 있습니다.

 

(총감독관 수 + 부감독관 수)가 최소가 되어야 합니다. 일단 총감독관 수는 모든 방에 1명씩 있어야 하므로 총 감독관 수는 모든 방의 개수 이상이 될 수 밖에 없습니다.

 

그렇기 때문에 모든 방의 인원에서 총 감독관이 감독할 수 있는 인원(B)를 빼주고 나머지 인원에 대해 부 감독관 수를 구해주면 됩니다!

 

 

★ 실수하기 쉬운 포인트

 

1. 감독관 수는 long으로 선언하여야 한다.

   (틀렸습니다 뜨면 long으로 바꾸는 것을 먼저 생각하자,,,,)

 

2. 방의 인원보다 총 감독관이 감독할 수 있는 인원(B)가 더 큰 경우가 존재한다.

 

 

코드

 

//수학 문제

import java.io.*;

public class N_13458 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try {
			int N = Integer.parseInt(br.readLine()); // 시험장의 개수
			int[] A = new int[N];

			String[] arr = br.readLine().split(" ");
			for (int i = 0; i < N; i++)
				A[i] = Integer.parseInt(arr[i]);

			String[] arr1 = br.readLine().split(" ");
			int B = Integer.parseInt(arr1[0]);
			int C = Integer.parseInt(arr1[1]);

			long numSupervisor = A.length; // 모든 방마다 총감독관 1명은 무조건 필요하니까
			for (int i = 0; i < N; i++) {
				if (A[i] <= B)
					continue;
				if ((A[i] - B) % C != 0)
					numSupervisor++;
				numSupervisor += ((A[i] - B) / C);
			}
			System.out.println(numSupervisor);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

결과

 

채점결과 PASS!

반응형
Comments