시험 감독 - 리팩토링

주어진 예제 케이스들 하나하나 다 통과시키도록해서 몫과 나머지 연산을 이용해서 어찌어찌 구현해서 정답은 맞았지만, 시간, 공간적으로 비효율적이라 리팩토링이 필수적이다.

아래코드에서는 각 시험장에 필요한 총 감독수를 계산한답시고 N 크기의 정수형 배열을 추가적으로 생성하고, i-for문이 3개나 존재한다. => 입력 배열1개, i-for문 1개로 리팩토링한다!⭐️⭐️⭐️⭐️⭐️ 정답 저장하는 변수 한개로 반복문 거듭할 수록 필요한 감독수 더해감으로써 총 필요 감독 수 정답 저장가능하다.

  1. 첫번째 for문에서 needSubSupervisor배열 생성해서 1로 초기화한 부 =>변수 ans 하나로 정답 저장 =>ans = N으로 초기화하고, 이 변수로 반복문 내에서 증가해나가면 된다.⭐️⭐️⭐️⭐️⭐️ 문제 조건에 따라 각 시험장마다 총감독은 오직 1명씩만 들어가있어야하기 때문에 필요한 전체 감독도 N개의 시험장에 총감독이 1명씩 들어가있으면 N명부터 시작한다! =>첫번째, 세번째 i-for문 소거✅

  2. 핵심로직인 두번째 i-for문 : 더 이상고칠 것이 없어보이지만 gap%C ==0 이든 아니든 동일하게 gap/C 를 더하는 것을 알 수 있다. 똑같은 코드가 2번이나 반복된다. 그러면 그냥 디폴트로 정답 변수 ans += gap/C로 하고, (gap%c !=0)인 경우에만 ans++ 로 ans를 1 더 증가시켜주면 된다!

package ss;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class TestSupervisor {
	static int N, A[],B,C;
	static int solve() {
		int sum = 0;
		int[] needSubSupervisor = new int[N];
		for(int i=0;i<N;i++) {//총감독수 오직1명만 들어가야하므로 총감독수 1명씩으로 셋팅.
			needSubSupervisor[i] = 1;
		}
		for(int i=0;i<N;i++) {
			int gap = A[i]-B;//총감독이 감독하고 남는 응시자들.
			if(gap<=0) continue;
			if(gap%C == 0) {//C의 배수인 경우 몫을 더하면 됨.
				needSubSupervisor[i] += gap/C;
			}else {//gap<C 또는 gap>C:나눠 떨어지지 않는 경우.
				needSubSupervisor[i] += (gap/C)+1;
			}
		}
		for(int i=0;i<N;i++) {
			sum += needSubSupervisor[i];
		}
		return sum;
	}
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		A = new int[N];
		String[] input = br.readLine().split(" ");
		for(int i=0;i<N;i++) {
			A[i] = Integer.parseInt(input[i]);
			
		}
		input = br.readLine().split(" ");
		B = Integer.parseInt(input[0]);
		C = Integer.parseInt(input[1]);
		
		System.out.println(solve());
		
		br.close();
	}

}
//System.out.print(A[i]+" ");
//System.out.println("B: "+B+" "+"C: "+C+" ");

Last updated