나 JAVA 봐라

[백준] 1946번 신입사원 본문

코딩테스트/그리디

[백준] 1946번 신입사원

cool_code 2024. 3. 3. 23:39

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

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

 

문제에 따르면, 서류/ 면접 등수가 하나라도 뒤쳐지면 탈락한다.

등수는 하나하나씩 직접 돌아가주면서 비교해줘야한다. 

이 때, 등수를 정렬하지 않으면 서류/면접 등수 두 개 모두 비교해주어야하는 코드가 복잡해지므로 먼저 서류 등수를 기준으로 오름차순 정렬을 해야했다.

 

Arraylist에 오름차순 기준으로 정렬할 수도 있지만, 서류 등수를 배열 인덱스로 하고 면접 등수를 값으로 하면 정렬 없이 처리할 수 있을 것 같아 해당 방법을 사용했다.

즉, rank[서류 등수] = 면접 등수 로 값을 입력 받았다.

 

서류 등수가 1등이면 당연히 합격이기 때문에 합격자count 정보를 담는 pass에 1을 먼저 담았다.

그리고 서류 1등의 면접 등수를 기준으로 비교를 시작해야하기 때문에 compare_rate에 서류1등의 면접등수를 담았다.

 

이 후, 서류 등수 2등부터 순서대로 돌아가며 면접 등수를 비교하여 

  • 면접 등수가 compare_rate보다 낮을 경우(즉, compare_rate < 면접등수) 
    • 별 다른 처리 없이 넘기기 (탈락)
  • 면접 등수가 compare_rate보다 높을 경우(즉, compare_rate > 면접등수)
    • 합격자count에 1 더하기
    • compare_rate를 더 높은 등수로 바꿔주기 (다음 비교할 등수부터는 해당 등수보다 더 높아야함)

위와 같은 방법으로 구현했다. 

 

package yejin.song;

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

public class BOJ_신입사원 {
    static int T;
    static int N;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        T = Integer.parseInt(br.readLine());

        // 테스트 케이스만큼 반복
        for (int i = 0; i<T; i++){
            N = Integer.parseInt(br.readLine());
            int rank[] = new int[N];

            for (int j = 0; j<N; j++){
                StringTokenizer st = new StringTokenizer(br.readLine(), " ");
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
                rank[a-1] = b;
            }

            int pass = 1; // 서류 1등은 무조건 붙음
            int compare_rate = rank[0]; //서류 1등의 면접 등수

            for (int j = 1; j<N; j++){
                if (compare_rate > rank[j]){
                    pass++;
                    compare_rate = rank[j];
                }
            }
            System.out.println(pass);
        }
    }
}

'코딩테스트 > 그리디' 카테고리의 다른 글

[프로그래머스] 큰 수 만들기  (0) 2024.08.14
[백준] 2217번 로프  (0) 2024.03.03