프론트엔드 개발자의 기록 공간

[백준 node.js] 1946번_신입 사원 본문

알고리즘_JS/백준_Greedy

[백준 node.js] 1946번_신입 사원

[리우] 2020. 12. 25. 23:59

백준 그리디 알고리즘 1946번_신입 사원

난이도 : 실버I

 

문제 설명

입출력

 

문제 풀이 : 입력으로 주어지는 지원자의 서류심사 성적 순위, 면접 성적 순위가 키 포인트이다. 점수가 아닌 순위이다. 또한 문제에서 "어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다." 이 말은 즉 A가 B보다 성적이든 면접이든 한 개의 등수만 높다면 뽑힌다는 얘기이다.

따라서 주어진 입력값을 성적 순위나 또는 면접 순위별로 정렬을 해준다(필자는 성적 순위 기준으로 정렬)

이후, 성적 순위별로 높은순서대로 정렬이 되어있으므로 면접 순위만 따져줘서 합격인지 불합격인지 가려내면된다.

성적 순위가 1등인 사원은 무조건 합격이므로 카운트를 세어준다. 이후 성적 순위 2등부터 차례로 반복문을 시행한다.

시행할때 자기보다 앞에 사원기준과 면접 순위를 비교하여 자신이 더 높다면 합격이고 그렇지 않다면 불합격인것이다.

왜냐하면 이미 성적순으로 정렬해주었기 때문에 성적이 2등부터는 자신의 앞 사원의 면접 등수보다 높아야지만 떨어지지 않기 때문이다.

예를들어 5명의 사원의 등수가 각각 [ [3, 2], [1, 4], [4, 1], [2, 3], [5, 5] ]이라면 성적 순위로 정렬하면

[ [ 1, 4 ], [ 2, 3 ], [ 3, 2 ], [ 4, 1 ], [ 5, 5 ] ]  이렇게 된다. 성적 순위가 1등인 [1, 4]는 무조건 합격이고 그리고 [2, 3]은 자신의 앞인 [1, 4]와 비교했을때 면접 등수가 높으므로 합격이다. [3, 2] 또한 [2, 3]과 비교했을때 면접 등수가 더 높으므로 합격이다. 이렇게 비교하면 [5, 5]인 사원을 제외하고 총 4명이 합격이 된다.

 

// 실버1 신입사원
function solution(n, list) {
   
    let arr = [];
    //이차원 배열 int형으로 바꿈
    for(i of list){
        arr.push(i.split(" ").map((el) => parseInt(el)));
    }
    
    //서류 순위별로 정렬
    arr.sort(function(a, b){
        return a[0] - b[0];
    })

    console.log(arr);

    //서류 1등 기준
    let tmp = arr[0][1];
    //뽑는 사원수
    let count = 1;
    //면접 등수 기준으로 사원수 카운트
    for(let i=1; i<arr.length; i++){
        if(tmp > arr[i][1]){
            tmp = arr[i][1];
            count += 1;
        }
    }
    console.log(count);
}

const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

let input = [];
rl.on("line", function (line) {
    //여러줄 입력
    input.push(line)
}).on("close", function () {
    let test = parseInt(input[0]);
    //console.log("test case : "+test);
    //for 인원수 카운터 변수
    let c = 1;
    //인원수 파악
    let n = 0;
    let list = []
    for(let i=1; i<=test; i++){
        n = parseInt(input[c]);
        //console.log("인원 : "+n);
        c += 1;
        for(let j=c; j<c+n; j++){
            list.push(input[j]);
        }
        solution(n, list);
        c += n; //인원수 카운트
        list = [];
    }
});

 

* 파일 입력 처리 코드줄을 보면 상당히 난잡한 것을 볼 수 있다. 프론트엔드 개발자를 희망하고있어서 JS를 위해 백준에서 node로 풀고있지만 입력이 상당히 불편하다. 파일 입력이 귀찮아 질 수록 파이썬이 간절해진다....

728x90
Comments