Computer Science/Algorithm :: 알고리즘

알고리즘 :: 상대평가, 정렬 조건, 핵심을 보자

HJPlumtree 2021. 9. 26. 21:12

알고리즘 공부하며 배운내용

 

 

상대평가

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);