해당 포스팅은 백준 1946번 신입사원 풀이를 다룬다. 문제 링크
코드는 javascript로 작성하였다.
1차 서류심사
와 2차 면접시험
으로 이루어진다.적어도 하나가 다른 지원자보다 떨어지지 않는
자만 선발한다. 서류심사 성적
, 면접 성적
의 순위가 공백을 사이에 두고 한 줄에 주어진다동석차 없이 결정
된다고 가정한다.각 테스트 케이스에 대해서 진영 주식회사가 선발할 수 있는 신입사원의 최대 인원수를 한 줄에 하나씩 출력한다.
적어도 하나가 다른 지원자보다 떨어지지 않는다
는 곧 서류심사와 면접시험 두 개가 하나라도 다른 지원자보다 높은 사람을 뽑겠다는 의미이다. 따라서 면접자가 A라고 할 때, A는 "자신보다 서류심사 성적이 높은 면접자들의 면접심사 성적보다 면접 성적이 높아야" 선발될 수 있다.
그렇다면 이를 어떻게 구현해야 할까?
문제에서 성적 순위에는 동석차가 없다
고 주어졌으므로, 서류심사를 기준으로 오름차순 정렬을 한 다음, 차례로 면접심사 성적 upper
를 기록한다. 면접자의 면접심사 성적이 upper보다 높다면 선발된 것이므로, upper을 그의 면접심사 성적으로 업데이트 한 다음 cnt += 1을 해주면 된다.
예제의 첫 번째 테스트케이스를 통해 설명하겠다.
cnt
를 0으로 선언한다.upper
을 Number.MAX_SAFE_Integer로 선언한다.면접성적 < upper
일 시,const input = require('fs').readFileSync('/dev/stdin').toString().split('\n').slice(0, -1);
const parsed = input.map(str => str.split(' ').map(c => parseInt(c)));
const t = parsed.shift();
// input을 각 테스트에 대한 배열로 변경
const tests = [];
for (let i = 0; i < parsed.length; i++) {
const line = parsed[i];
if (line.length === 1) {
const [n] = line;
tests.push(parsed.slice(i + 1, i + n + 1).sort(([a], [b]) => a - b));
i += n;
}
}
const ans = [];
// 각 테스트에 대한 결과 체크
for (let test of tests) {
let cnt = 0;
let upper = Number.MAX_SAFE_INTEGER;
for (let i = 0; i < test.length; i++) {
const [a, b] = test[i];
if (b < upper) {
cnt += 1;
upper = b;
}
}
ans.push(cnt);
}
console.log(ans.join('\n'));