본문 바로가기
알고리즘

[프로그래머스] Lv.3 인사고과 (JS)

by kigo23 2023. 7. 1.
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/152995?language=javascript

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

(문제 내용은 링크를 참조해주세요)

 

처음엔 매우 간단한 문제라고 생각되었습니다. 완호가 탈락 대상인지 검사한 후, 탈락 대상이 아니라면 본인 보다 높은 점수를 받은 사람의 수를 찾아 자신의 등수를 계산하면 된다고 생각했습니다.

function solution(scores) {
    var answer = 0;
    var wh = scores[0]
        
    // 탈락 여부 확인
    if (scores.filter(a => (a[0] > wh[0] && a[1] > wh[1])).length > 0) return -1;

    // 본인보다 높은 사람 수 + 1로 등수 계산
    return scores.filter(a => a[0] + a[1] > wh[0] + wh[1]).length + 1;
}

위 코드로 연습문제는 모두 통과했지만, 채점에서는 72점이 나왔습니다. 완호보다 점수 합산이 높은 사람도 탈락 대상이 될 수 있다는 것을 간과하였습니다.

실행 결과

 

그래서 완호보다 점수 합산이 높은 인원 중 탈락 대상인 사람의 수를 찾아내서 그 수만큼 완호의 등수를 높이는 코드로 수정 하였습니다. 만약 모든 탈락 대상인 인원을 찾다간 시간 초과될 가능성이 있기 때문에 완호보다 높은 등수를 받을 가능성이 있는 인원만 체크하였습니다.

function solution(scores) {
    var answer = 0;
    var wh = scores[0]    
    
    // 탈락 여부 확인
    if (scores.filter(a => (a[0] > wh[0] && a[1] > wh[1])).length > 0) return -1;
    
    // 완호보다 점수 합산이 높은 사람 필터링
    scores = scores.filter(a => a[0] + a[1] > wh[0] + wh[1])
    
    // 왼쪽 숫자 기준으로 오름차순 정렬
    scores.sort((a, b) => a[0] - b[0]);

    // 탈락 대상자 수
    var failCnt = 0;

    // 우측 인덱스와 비교하여 탈락 대상 검사
    for(var i=0; i<scores.length; i++){
        for(var j=i+1; j<scores.length; j++){
            if(scores[i][0] < scores[j][0] && scores[i][1] < scores[j][1]){
                failCnt++;
                break;
            }
        }
    }
    
    // 등수 계산
    return scores.length + 1 - failCnt;
}

 

정답처리 되었습니다.