문제 설명
1946번: 신입 사원
첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성
www.acmicpc.net
모든 지원자와 비교 시 서류심사와 면접심사 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다.
<-(대우)-> 어떤 지원자와 비교 시 서류심사와 면접심사 성적 모두 다른 지원자보다 떨어지는 자는 선발하지 않는다.
문제 풀이
전체를 각각 다 비교할 경우 시간복잡도는 N의 2제곱. 이 문제의 경우 N은 100,000까지 주어지므로 100,000 x 100,000 = 100억이다. 1억에 1초라고 할 때, 100초가 걸리므로 문제의 시간제한 2초에는 턱없이 불가능하다.
따라서 다른 방식으로 구현해야했다.
두 종류의 수를 동시에 비교해야 하므로 둘 중 하나는 일정한 기준에 배열하는 것이 비교하기 편하겠다고 생각했다.
그래서 N+1크기의 배열을 만들고, 서류심사 등수에 맞춰 면접심사 결과를 넣었다.
등수는 중복되지 않으므로 , 1번째 배열부터 N번째까지 비교를 진행하면, 서류심사는 무조건 낮은 등수이므로 면접결과에 따라 정해진다.
면접결과가 이전에 나온 최소값보다 작은 수가 나온 경우가 선발할 수 있는 지원자이다.
이에 맞춰 코드를 구현하였다.
문제 풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class _1946_신입사원_배열 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(in.readLine());
for(int tc = 1;tc<=T;++tc) {
int N = Integer.parseInt(in.readLine());
int[] arr = new int[N+1];
StringTokenizer st;
for(int i = 0; i<N;++i){
st = new StringTokenizer(in.readLine());
arr[Integer.parseInt(st.nextToken())]=Integer.parseInt(st.nextToken());
}
int count = 1;
int BigB = arr[1];
for(int i = 1; i<=N;++i) {
if(BigB == 1) {
break;
}
if(arr[i] < BigB) {
++count;
BigB = arr[i];
}
}
System.out.println(count);
}
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
Baekjoon_17142_연구소3 (0) | 2020.12.17 |
---|---|
Baekjoon_17141_연구소2 (0) | 2020.12.17 |
Baekjoon_1541_잃어버린 괄호 (0) | 2020.12.15 |
Baekjoon_2217_로프 (0) | 2020.12.15 |
Baekjoon_1074_Z (0) | 2020.12.14 |