https://www.acmicpc.net/problem/1946
// test.txt
3
5
3 2
1 4
4 1
2 3
5 5
7
3 6
7 3
4 2
1 4
5 7
2 5
6 1
5
1 5
2 4
3 3
4 2
5 1
sol1 - ❌
const [T,...input] = require('fs').readFileSync('test.txt').toString().trim().split('\n');
for(let i=0;i<T;i++) {
let N = input.shift();
let Case = input.splice(0,N).map(v=>v.split(' ').map(Number)).sort((a,b) => a[0]-b[0]);
let answer = 1;
for(let i=1;i<N;i++) {
if(Case[i][1]<Case[i-1][1]) answer++;
}
console.log(answer);
}
//4
//3
//5
1차 시험을 기준으로 오름차순 정렬한다. 1차 시험의 1등은 2차 시험의 등수와 상관없이 항상 합격이기 때문에, 1등을 카운트해놓고 시작했다. 2차 시험에서 앞사람보다 등수가 높기만 하다면 등수가 몇인가는 상관없이 합격이기 때문에 별도로 2차 시험 등수를 정렬하거나 값을 고려하진 않았는데 테스트 케이스는 통과하지만 제출 시 40%쯤에서 틀리게 된다. 어떤 예외 케이스를 해결하지 못한 건지는 아직 알지 못했다.
// Case[]
// Case1
[ [ 1, 4 ], [ 2, 3 ], [ 3, 2 ], [ 4, 1 ], [ 5, 5 ] ]
// Case2
[
[ 1, 4 ], [ 2, 5 ],
[ 3, 6 ], [ 4, 2 ],
[ 5, 7 ], [ 6, 1 ],
[ 7, 3 ]
]
// Case3
[ [ 1, 5 ], [ 2, 4 ], [ 3, 3 ], [ 4, 2 ], [ 5, 1 ] ]
sol2
const [T,...input] = require('fs').readFileSync('test.txt').toString().trim().split('\n');
for(let i=0;i<T;i++) {
let N = input.shift();
let Case = input.splice(0,N).map(v=>v.split(' ').map(Number)).sort((a,b) => a[0]-b[0]);
let answer = 1;
let top = Case[0][1];
for(let i=1;i<N;i++) {
if(Case[i][1]<top) {
top = Case[i][1];
answer++;
}
if(top===1) break;
}
console.log(answer);
}
//4
//3
//5
1차 시험 합격자의 2차 점수를 top에 주고, top 보다 2차 점수가 낮다면 합격이므로 카운트한다. sol1 과는 다르게 합격자를 만날 때마다 top을 갱신해주면서 찾았기 때문에 범위가 더 명확해진다.
배열을 돌다가 2차 시험의 1등을 만나게 되면 1차 시험 오름차순 정렬상 그 뒷사람들이 합격할 수 있는 방법은 없다. 따라서 1등일 경우에 for문을 멈춰주면 속도가 빨라질 거 같았지만 유의미한 차이는 없었다.
'Study > Algorithm' 카테고리의 다른 글
[BEAKJOON / node.js] 16120 PPAP (0) | 2022.07.11 |
---|---|
[BEAKJOON / node.js] 11509 풍선 맞추기 (0) | 2022.07.06 |
[BEAKJOON / node.js] 1475 방 번호 (0) | 2022.06.29 |
[programmers / JavaScript] 큰 수 만들기 (0) | 2022.06.25 |
[BEAKJOON / node.js] 17298 오큰수 (0) | 2022.06.25 |