티스토리 뷰

알고리즘/백준

[BAEKJOON]1946 신입 사원

응애~ 개발자 2023. 2. 10. 17:20
728x90
반응형

문제 요약

  • 알고리즘 분류: 그리디, 정렬
  • 난이도:Silver1
  • 문제내용:
    • T개의 테스트 케이스가 있고 각 테스트 케이스 마다 N개 응시자가 있다.
    • 각 응시자는 필기, 면접 등수로 매긴다.
    • 필기, 면접 둘중하나가 다른 응시자 보다 괜찮은 사람을 하나씩 출력해라.
 

1946번: 신입 사원

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

www.acmicpc.net

문제풀이

 이번 문제는 그리디문제인데, 약간 아이디어 문제측에 속한다. 정답을 어떻게 구할지만 구현은 쉽다. 그리디에 설명은 밑에 사이트에 참조하면된다.

https://jih3508.tistory.com/70

 

[알고리즘 이론] 그리디(Greedy)

이론 그리디 알고리즘은 탐욕 알고리즘이라고 부르기도 한다. 즉, 매 순간 선택할때 가장 좋은것을 선택하는 알고리즘이다. 이 알고리즘은 이론상 설명 단순하고 다른 알고리즘에서 기초적으로

jih3508.tistory.com

문제 접근 방법

 각 사원마다 다른 사원이랑 면접자 비교할려면 이중 for문으로 풀어야한다. 그러면 시간복잡도상 O(n^2)시간이 나오고  최대 인원수는 10만이기 때문에 시간 초과가 나올것이다. 그러면 정렬까지해서 O(n)안으로 처리하는 방법을 생각해야한다.

 방법은 간단하다 일단 필기, 면접 둘중 하나 기준으로 정렬한다. 그리고 그 기준의 정렬된 첫번째의 다른 것으로 커트라인 기준으로 정하고  그 다음 순위의 다른 응시 순위와 커트라인 순위를 비교해서 낮으면 합격자수를 +1해주고 커트라인 순위를 현재 순위로 변경한다. 예를 들어 필기 기준으로 먼저 정렬을 한 다음 필기 점수 1등인 사람의 면접 순위를 커트라인으로 잡고 2등 부터 면접 순위와 비교하면서 낮으면 2등의 면접순위를 커트라인으로 잡으면서 합격자수를 구하면된다.

초록색은 합격자

 2번테 테스트케이스에서 필기 위주로 정렬 한 표이다. 위 표를 예시로 들겠다.

필기 1위는 면접 4위이다. 4위를 커트라인으로 잡으면 된다. 그다음 필기 2위는 면접 5위이다 커트라인 미만이라서 탈락이다. 3위도  면접 커트라인 안되서 탈락이다. 그 다음 4위를 보면 면접은 2위이다.  2위를 커트라인을 잡고 면접 2위 미만인 응자자는 필기 6위한사람이다. 

 위 예시대로 커트라인 미만인 사람을 찾고 그 사람을 커트라인으로 잡으면서 진행하면된다.

정리

  1. 리스트/ 배열로 저장한 다음 정렬한다.
  2. 정렬 기준으로 1등인 사람의 다른 순위를 커트라인으로 잡는다.
  3. 정렬 기준으로 2등 부터 다른 응시한 순위 커트라인 미만인 순위를 찾는다.
  4. 커트라인 미만인 순위를 찾았으면 합격자수를 +1해주고 그 순위를 커트라인으로 한다.

Code

Python

import sys
input = sys.stdin.readline

for _ in range(int(input())):
    N = int(input())
    gradles = []
    for _ in range(N):
        gradles.append(list(map(int, input().split())))

    gradles.sort()
    top = gradles[0][1]
    count = 1
    for gradle in gradles[1:]:
        if gradle[1] < top:
            count += 1
            top = gradle[1]
    print(count)

Java

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

public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		StringTokenizer st;
		int[][] gradles;
		int N, top, count;
		while(T-- > 0) {
			N = Integer.parseInt(br.readLine());
			gradles = new int[N][2];
			for(int i = 0; i < N; i++) {
				st = new StringTokenizer(br.readLine());
				gradles[i][0] = Integer.parseInt(st.nextToken());
				gradles[i][1] = Integer.parseInt(st.nextToken());
			}
			Arrays.sort(gradles, (o1, o2) -> o1[0] == o2[0]? o1[1] - o2[1] : o1[0] - o2[0]);
			top = gradles[0][1];
			count = 1;
			for(int i = 1; i < N; i++) {
				if(gradles[i][1] < top) {
					count++;
					top = gradles[i][1];
				}
			}
			System.out.println(count);
		}
	}
	
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BAEKJOON]1309 동물원  (0) 2023.02.14
[BAEKJOON]1781 컵라면  (0) 2023.02.13
[BAEKJOON]11052 카드 구매하기  (0) 2023.02.09
[BAEKJOON]7562 나이트의 이동  (0) 2023.02.08
[BAEKJOON]1850 최대공약수  (0) 2023.02.07
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함