https://school.programmers.co.kr/learn/courses/30/lessons/152995#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
- 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한번이라도 있다면 그 사원은 인센티브를 받지 못한다.
- 그렇지 않은 사원은 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급된다.
- 동석차이며, 동석차의 수만큼 다음 석차는 건너 뛴다.
입력이 이렇게 주어진다.
[2,2]는 완호의 근무 태도 점수와 동료 평가 점수이다.
[2,1]은 [3,2] 보다 점수가 모두 낮으므로 인센티브를 받지 못한다. 그리고 [1,4] , [3,2], [3,2] 는 합이 5이므로 완호의 합인 4보다 크다. 그러므로 결국 완호는 4등이 된다.
문제에 대한 아이디어
이 문제는 구현 문제인것 같다.
아이디어를 잘 생각해서 구현을 하면된다.
내가 생각한 아이디어는 제일 처음 점수를 입력받을 때, 근무 태도 점수를 내림차순으로 입력 받는다. 만약 근무 태도 점수가 같으면 동료 평가 점수를 오름 차순으로 받는다.
그 이유는 인센티브를 받지 못한 상대를 찾기 위해서이다.
- 근무 태도 점수를 내림차순으로 할 경우 자신 보다 앞에 있는 것은 무조건 자신보다 점수가 낮다.
- 동료 평가 점수를 오름 차순했으로 정렬했다. 만약 자신보다 앞에 있는 것중 자신 보다 근무 태도 점수가 높은게 있으면 인센티브를 받지 못한다.
- 이제 2개의 합이 완호의 합보다 큰것을 찾으면 된다.
구현
import java.util.*;
class Node implements Comparable<Node>{
int x; int y;
public Node(int x, int y){
this.x=x;
this.y=y;
}
// 근무 태도 점수는 내림차순, 동료 평가 점수는 오름 차순
public int compareTo(Node n){
if(this.x == n.x)
return this.y-n.y;
return n.x - this.x;
}
}
class Solution {
ArrayList<Node> score = new ArrayList<>();
public int solution(int[][] scores) {
int answer = 0;
int att=0;
int sc=0;
Node wanho = new Node(scores[0][0], scores[0][1]);
score.add(wanho);
for(int i=1; i<scores.length; ++i){
score.add(new Node(scores[i][0], scores[i][1]));
}
Collections.sort(score);
int maxScore = 0;
for(Node n : score){
//앞에 동료 평가 점수가 더 높은게 있는지 검사
if(n.y < maxScore){
if(n.equals(wanho)) {
answer = -1;
break;
}
}
//없으면 동료 평가 점수 더 큰 것으로 바꿈
else{
maxScore = Math.max(maxScore, n.y);
//완호 점수 합 보다 큰것이 있으면 answer 카운트
if(n.x + n.y > wanho.x+wanho.y) ++answer;
}
}
if(answer == -1) return answer;
else return answer+1;
}
}
'BackEnd > 알고리즘 공부' 카테고리의 다른 글
양과 늑대(프로그래머스) JAVA (0) | 2023.03.06 |
---|---|
미로 탈출 명령어(프로그래머스) JAVA (0) | 2023.03.03 |
파괴되지 않은 건물(프로그래머스) JAVA (0) | 2023.02.27 |
등산코스 정하기(프로그래머스) JAVA (0) | 2023.02.22 |
운동(백준_1956) (0) | 2023.02.22 |