import java.util.ArrayList;
import java.util.List;
class Solution {
public int solution(int[][] scores) {
int answer = 0;
int a=scores[0][0];
int b=scores[0][1];
List<Point> pointList=new ArrayList<>();
for (int i = 1; i < scores.length; i++) {
if(scores[i][0]>a&&scores[i][1]>b)
return -1;
if(scores[i][0]<=a&&scores[i][1]<=b)
continue;
if(scores[i][0]+scores[i][1]<=a+b)
continue;
answer++;
List<Point> delete=new ArrayList<>();
boolean rejectFlag = false;
for (Point point : pointList) {
if(scores[i][0]>point.a&&scores[i][1]> point.b){
//pointList.remove(point);
delete.add(point);
}else if(scores[i][0]<point.a&&scores[i][1]< point.b){
rejectFlag=true;
break;
}
}
if(rejectFlag){
answer--;
continue;
}
if(!delete.isEmpty()) {
answer-=delete.size();
pointList.removeAll(delete);
}
pointList.add(new Point(scores[i][0],scores[i][1]));
}
return answer+1;
}
class Point{
int a,b;
public Point(int a, int b) {
this.a = a;
this.b = b;
}
}
}
케이스를 잘 나누기만 하면 풀 수 있는 문제다.
i=1부터 반복을 돌며 해당 사원의 점수와 완호의 점수를 비교한다. (for-loop)
만약 완호가 해당 사원보다 근무,평가 모두 낮으면 완호는 인센티브를 받지 못하니 -1을 return한다.
만약 새로운 사원이 완호와 비교했을 때 두 점수 모두 같거나 적다면 해당사원은 완호의 인센티브 등수에 영향을 미치지 못하니 pass한다.
또, 해당 사원의 점수 합이 완호보다 작으면 마찬가지로 영향이 없으니 pass한다.
이 조건들을 통과하게 되면 완호보다 앞에 있을 수 있다.
여기서 한가지 주의해야할 점은 새로운 사원이 들어왔을 때 기존에 완호보다 등수가 높던 사원이 해당 사원보다 근무점수, 평가점수가 낮아 인센티브 제외가 될 수 있기에 해당 경우를 검사한다.
또, 반대로 기존 사원에 비해 새로운 사원이 점수가 낮아 제외대상이 되는 경우 완호의 인센티브 등수에 영향을 미치지 못한다.
이렇게 케이스만 잘 나누면 반복문 한번으로 (정확히는 2중반복문 한번) 문제를 해결할 수 있다.
'Algorithm > Programmers' 카테고리의 다른 글
[Lv.3] 표 병합 (0) | 2023.04.27 |
---|---|
[Lv.3] 표현 가능한 이진트리 (0) | 2023.04.27 |
[Lv.2] 무인도 여행 (0) | 2023.04.25 |
[Lv.3] 추석 트래픽 -자바 (0) | 2023.04.25 |
[Lv.3] 길 찾기 게임 (0) | 2023.04.25 |