알고리즘 공부하며 배운내용
상대평가
2번의 시험으로 학생들을 선발한다.
그 후 상대평가로 뽑는다.
어떤 학생보다 두 과목 높거나 같은 점수를 받은 학생이 있으면 어떤 학생은 선발이 안된다.
반대로 두 과목 모두 높거나 같은 점수가 없으면 입학한다.
모든 과목의 점수가 같으면 1명만 입학할 수 있다.
예를 들어 3명의 성적이 이렇다면,
(700, 800), (800, 800), (700, 700)
세 번째 학생은 불합격이다.
이 데이터를 바탕으로 총 몇 명이 입학할 수 있는지 알아보자
들어오는 값
첫째 줄에 학생수 N이 입력된다.
둘째 줄부터 N줄까지 시험점수 2개가 입력된다.
최소 0점, 최대 1000점
예)
5
100 200
200 300
400 400
300 500
500 300
구하고 싶은 값
합격한 학생이 몇 명인지 출력
예)
3
핵심 포인트
정렬이 핵심이다. 과목을 A, B라고 해보자
A 과목을 내림차순 정렬 IF A과목 같은 점수면 B 과목 내림차순 정렬을 해보자
그럼 A 과목은 점점 낮은 점수가 나온다.
즉 밑으로 내려가는데 B 과목의 점수가 낮아버리면 합격이 안되고,
B 과목의 점수가 높아야 위에 친구보다 B 과목을 잘해서 합격이 되는거다
이런 핵심을 잘 찾아야겠다.
코드
조금 지저분한데 졸려서 이대로 나둬야겠다.
의미는 녹아있기를!
// VSCode에서 JavaScript 테스트 하기위한 코드
// 메모장에 테스트 케이스 넣고 r_evaluation.txt로 저장했다
let fs = require('fs')
let input = fs.readFileSync('r_evaluation.txt').toString().split('\n')
// 지원자를 제외하고 input에 점수만 남겨두려고
let applicant = +input.shift()
let max = 0
let pass = 0
// 두 점수를 다시 갈라준다.
function splitSubject(arr) {
return arr.map(ele => ele.split(' '))
}
let des = splitSubject(input)
// A과목 내림차순 정렬 if A가 같으면 B과목 내림차순
des = des.sort((a, b) => {
if(a[0] === b[0]) {
return +b[2] - +a[1]
}
return +b[0] - +a[0]
})
// B과목 점수가 max보다 같거나, 높으면 합격
for(let i = 0; i < applicant; i++) {
if(max < des[i][1]) {
max = des[i][1]
pass++
}
}
console.log(pass);
'Computer Science > Algorithm :: 알고리즘' 카테고리의 다른 글
알고리즘 :: 백준 2798번 - 변형 블랙잭 #JavaScript (0) | 2021.09.30 |
---|---|
알고리즘 :: 찍먹 vs 부먹, 업그레이드 필요, 최소최대 실패 (0) | 2021.09.28 |
알고리즘 :: 줄 세우기, 병합정렬 응용 (0) | 2021.09.26 |
알고리즘 :: 마라톤, Merge Sort [푸는중] (0) | 2021.09.26 |
알고리즘 :: 가장 튼튼한 줄, 크레인 (0) | 2021.09.24 |