본문 바로가기

Algorithm/Practice

Programmers - 인사고과 with JAVA

 

 

로직

편하게 점수를 A, B라고 하자.

조건에서는 현재 자신의 점수보다 A, B 둘다 높은 점수가 있다면 탈락이다.

예시 : (7, 1), (6, 2), (3, 2), (3, 1), (2, 2), (2, 1)

1. A를 내림차순으로 정렬한다. 

-> 앞에 있을수록 A점은 뒤에보다 높다.

-> 따라서 항상 B점은 앞에보다 높아야한다.

A : 7, 6, 3, 3, 2, 2

B : 1, 2, 2, 1, 2, 1

-> 이렇게 된다면 (3, 2), (3, 1)과 같이 A점이 같은 경우에 (3, 1)의 경우 앞에 있는 수들과 B점을 비교해야 한다.

 

=> 현재 점수의 A점은 앞에 A보다 작거나 같고 B점은 모른다.

 

2. A가 같다면 B를 오름차순으로 정렬한다.

A : 7, 6, 3, 3, 2, 2

B : 1, 2, 1, 2, 1, 2

-> 위와 같이 정렬시 현재 점수들은 다른 B점과 비교할 필요가 없어진다.

 

=> 현재 점수의 A점은 앞에 A보다 작거나 같고 B점은 앞에보다 같거나 크다. => 따라서 조건에 맞다면 탈락되지 않는다.

 

 

코드 1 

import java.util.*;
class Solution {
    public int solution(int[][] scores) {
        int[] wonho = scores[0];
        Arrays.sort(scores, (x, y) -> x[0] == y[0] ? x[1] - y[1] : y[0] - x[0]);
        int answer = 1;
        int maxScore = 0;
        int sum = wonho[0] + wonho[1];
        for (int[] score : scores) {
            if (score[1] < maxScore) {
                if (score.equals(wonho)){
                    return -1;
                }
            }
            else{
                maxScore = Math.max(maxScore, score[1]);
                if (score[0] + score[1] > sum){
                    answer++;   
                }
            }
        }
        return answer;
    }
}

 

코드 2

import java.util.*;
class Solution {
    public int solution(int[][] scores) {
        int answer = 0;
        int[] wanho = scores[0];
        Arrays.sort(scores, Comparator.comparing((int[] arr) -> -arr[0])
                   .thenComparing(arr -> arr[1]));
        int y_max = scores[0][1];
        List<List<Integer>> map = new ArrayList<>();
        for(int i=0; i<scores.length; i++){
            if(scores[i][1] >= y_max){
                y_max = Math.max(y_max, scores[i][1]);
                map.add(Arrays.asList(scores[i][0], scores[i][1]));
            }
        }
        Collections.sort(map, Comparator
                         .comparing(arr -> -(arr.get(0)+arr.get(1))));
        int rank = 0;
        for(List<Integer> now : map){
            rank += 1;
            if(now.get(0) == wanho[0] && now.get(1) == wanho[1]){
                return rank;
            }
        }
        return -1;
    }
}

 

 

 

코드 3

import java.util.*;
class Solution {
    public int solution(int[][] scores) {
        int rank = 1;
        int[] wanho = scores[0];
        Arrays.sort(scores, Comparator.comparing((int[] arr) -> -arr[0])
                   .thenComparing(arr -> arr[1]));
        int sum = wanho[0]+wanho[1];
        int y_max = scores[0][1];
        for(int i=0; i<scores.length; i++){
            if(scores[i][1] >= y_max){
                y_max = scores[i][1];
                if(sum < scores[i][0] + scores[i][1]){
                    rank += 1;
                }
            }
            else{
                if(scores[i] == wanho){
                    return -1;
                }
            }
        }
        return rank;
    }
}