기타/코딩테스트

(코테) 프로그래머스_인사고과 *정렬 , 배열

불광동 물주먹 2025. 9. 2. 22:52

 

 

 

 

 

 

import java.util.*;

class Solution {
    public int solution(int[][] scores) {
        int answer = 0;
        int max =-1;
        int wa=scores[0][0];
        int wb=scores[0][1];
        
        Arrays.sort(scores, (a,b)->{            
           if(a[0]==b[0]) return a[1]-b[1];
             else return b[0]-a[0];            
        });
        boolean wanhoAlive= false;
        //완호 탈락자인지 체크
        for(int[] next:scores){            
            int a=next[0];
            int b=next[1];
            //탈락자
            if(b<max){
                if(a==wa && b==wb) return -1;
                continue;
            }
            if(b>max) max=b;   
            // 생존자. 완호 점수쌍이면 생존 체크
            if (a == wa && b == wb) wanhoAlive = true;
        }
        
        //if(!wanhoAlive) return -1;
        int rank = 1;
        max =-1;
        //원호가 통과 됐으면 원호 보다 상위 순위 구하기
        for(int[] next:scores){ 
            int a=next[0];
            int b=next[1];
            if (b < max) continue;         // 탈락자 스킵 (핵심 수정)
            if(a+b > wa+wb) rank++;              
            //if(a+b <= wa+wb) continue;                       
            if (b > max) max = b;
        }
        
        return rank;
    }
}

 

회고 

1.문제 유형

우선 문제를 처음 접근할때 생각보다 단순할거라 판단했다. 

하지만 생각보다 예외 조건 , 접근이 까다로웠다.

2차원 배열에    1차원 안 배열을 기준으로 내림차순 , 2차우너 배열을 기준으로 오름차순으로 
조건에 맞게 예외처리하는게 굉장히 까다로웠다.  아이디어도 떠올리지 못했다.

그리고 기준이되는 원호 직원의 인사고과 점수를 기준으로 1. 탈락자인지 체크 2.본인보다 높은 고과 체크 후 카운팅

 

1. 탈락자 체크에서   2차원 배열 구간만을 기준으로 max 값을 갱신을 하며 탈락자를 체크하였다.

ex) 5,3   2,9   1,5  1,3    5,7    3,3  

-> 정렬 1차원배열은 내림차순, 2차원은 오름차순으로 정렬

->      5,3  5,7    3,3    2,9    1,3   1,5    로 정렬  

         통과 통과  탈락  통과   탈락 탈락

max    3     7      7        9        9     9

 

 

2. 본인보다 높은 고과 체크 후 카운팅 

위 정렬된 기준에서 

탈락자 제외하고 본인의 합산값보다 크면 count++ 
탈락자는 카운팅하지 않는다!