Devtraces
개발자취
Devtraces
전체 방문자
오늘
어제
  • 분류 전체보기
    • Baekjoon
    • Programmers

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 그리디 알고리즘
  • recursive
  • Matrix
  • sort
  • Set
  • level2
  • Kakao
  • BFS
  • DP
  • math
  • union-find
  • stack
  • level4
  • dfs
  • GCD
  • level3
  • prime number
  • Queue
  • programmers
  • Dijkstra
  • two pointer
  • map
  • Trie
  • binary search
  • greedy
  • java
  • 백준
  • PriorityQueue
  • floyd-warshall
  • Tree

최근 댓글

최근 글

티스토리

Devtraces
[프로그래머스 Level.3] 인사고과 (연습문제) (Java)
Programmers

[프로그래머스 Level.3] 인사고과 (연습문제) (Java)

2023. 2. 5. 00:12

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/152995#

 

프로그래머스

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

programmers.co.kr

 

 

 

코딩테스트 연습 > 연습문제 > 인사고과

 

 

문제 설명

 

 

완호네 회사는 연말마다 1년 간의 인사고과에 따라 인센티브를 지급합니다. 각 사원마다 근무 태도 점수와 동료 평가 점수가 기록되어 있는데 만약 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한 번이라도 있다면 그 사원은 인센티브를 받지 못합니다. 그렇지 않은 사원들에 대해서는 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됩니다. 이때, 두 점수의 합이 동일한 사원들은 동석차이며, 동석차의 수만큼 다음 석차는 건너 뜁니다. 예를 들어 점수의 합이 가장 큰 사원이 2명이라면 1등이 2명이고 2등 없이 다음 석차는 3등부터입니다.

 

각 사원의 근무 태도 점수와 동료 평가 점수 목록 scores이 주어졌을 때, 완호의 석차를 return 하도록 solution 함수를 완성해주세요.

 


제한 사항
  • 1 ≤ scores의 길이 ≤ 100,000
  • scores의 각 행은 한 사원의 근무 태도 점수와 동료 평가 점수를 나타내며 [a, b] 형태입니다.
    • scores[0]은 완호의 점수입니다.
    • 0 ≤ a, b ≤ 100,000
  • 완호가 인센티브를 받지 못하는 경우 -1을 return 합니다.

 


 

입출력 예
scores result
[[2,2],[1,4],[3,2],[3,2],[2,1]] 4

 


입출력 예 설명

 

5 번째 사원은 3 번째 또는 4 번째 사원보다 근무 태도 점수와 동료 평가 점수가 모두 낮기 때문에 인센티브를 받을 수 없습니다. 2 번째 사원, 3 번째 사원, 4 번째 사원은 두 점수의 합이 5 점으로 최고점이므로 1 등입니다. 1 등이 세 명이므로 2 등과 3 등은 없고 1 번째 사원인 완호는 두 점수의 합이 4 점으로 4 등입니다.

 

 

 

나의코드

import java.util.*;

class Solution {
    public int solution(int[][] scores) {
        int answer = 1;
        int maxPeerReviewScore = 0; // 현재까지 동료 평가 점수 최댓값
        int[] whScore = scores[0];
        
        // 근무 태도 점수 내림차순, 동료 평가 점수 오름차순
        Arrays.sort(scores, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);
        
        for(int i=0; i<scores.length; i++) {
            // maxPeerReviewScore가 동료 평가 점수보다 높으면 해당 사원은 인센티브 X
            if(maxPeerReviewScore > scores[i][1]) {
                // 완호 앞에 동료 평가 점수가 높은 사람이 있으면 인센티브 X
                if(whScore[0] == scores[i][0] && whScore[1] == scores[i][1]) return -1;
            } else {
                // 완호보다 점수 합산 높으면 완호의 석차 증가
                if(whScore[0] + whScore[1] < scores[i][0] + scores[i][1]) answer++;
                
                // 동료 평가 점수 현재까지 최댓값으로 업데이트
                maxPeerReviewScore = Math.max(maxPeerReviewScore, scores[i][1]);
            }
        }
        
        return answer;
    }
}

 

풀이

  1. 우선 완호의 석차를 1등부터 시작하기 위해 answer를 1로 초기화 한다.
  2. int형 배열 whScore를 만들고 완호의 근무 태도 점수와 동료 평가 점수를 저장한다.
  3. 그리고 주어진 scores를 근무 태도 점수를 기준으로 내림차순, 근무 태도 점수가 같다면 동료 평가 점수 기준으로 오름차순 정렬한다.
  4. 완호보다 근무 태도 점수도 높고 동료 평가 점수도 높은 사원이 있는지 확인하기 위해 int형 변수 maxPeerReviewScore를 선언하고 0으로 초기화 한다.
  5. 근무 태도 점수는 내림차순으로 정렬하고 동료 평가 점수는 오름차순으로 정렬했기 때문에 완호보다 동료 평가 점수가 높다면 근무 태도 점수는 무조건 높을 수 밖에 없다.
    ex) [[2,2], [1,4], [3,2], [3,1], [3,3], [2,1], [2,3]] 이라면 정렬 후에는 [[3,1], [3,2], [3,3], [2,1], [2,2], [2,3], [1, 4]]이 되어 완호보다 앞에서 동료 평가 점수가 높다면 근무 태도 점수는 무조건 높다. (근무 태도 점수가 완호와 같거나 낮다면 정렬 후에 완호보다 뒤에 위치하게 된다)
  6. 정렬된 scores를 for문을 돌면서 완호의 앞에서 동료 평가 점수(scores[i][1])가 높은 사람이 있으면 완호는 인센티브를 받을 수 없으므로 -1을 반환하고 그 외의 경우에는 점수 합산이 완호의 점수 합산보다 높으면 완호의 석차를 증가시키고 동료 평가 점수를 최댓값으로 업데이트 시켜나가면 된다.
  7. 따라서 for문을 돌면서 동료 평가 점수(scores[i][1])가 maxPeerReviewScore보다 같거나 클 때 완호의 점수 합산과 비교하여 완호보다 크다면 완호의 석차 answer를 1씩 증가시키고 maxPeerReviewScore를 더 큰 값으로 업데이트 한다.
  8. 그러다 maxPeerReviewScore가 동료 평가 점수(scores[i][1])보다 클 때 해당 사원은 인센티브를 받지 못하는데 해당 사원이 완호라면 -1를 반환하는 것이다. 

 

 

 

 

'Programmers' 카테고리의 다른 글

[프로그래머스 Level.2] 호텔 대실 (연습문제) (Java)  (0) 2023.02.06
[프로그래머스 Level.4] 행렬과 연산 (2022 KAKAO TECH INTERNSHIP) (Java)  (0) 2023.02.05
[프로그래머스 Level.3] 정수 삼각형 (동적계획법(Dynamic Programming)) (Java)  (0) 2023.02.03
[프로그래머스 Level.2] 무인도 여행 (연습문제) (Java)  (0) 2023.02.03
[프로그래머스 Level.2] 숫자 변환하기 (연습문제) (Java)  (0) 2023.02.02
    'Programmers' 카테고리의 다른 글
    • [프로그래머스 Level.2] 호텔 대실 (연습문제) (Java)
    • [프로그래머스 Level.4] 행렬과 연산 (2022 KAKAO TECH INTERNSHIP) (Java)
    • [프로그래머스 Level.3] 정수 삼각형 (동적계획법(Dynamic Programming)) (Java)
    • [프로그래머스 Level.2] 무인도 여행 (연습문제) (Java)
    Devtraces
    Devtraces

    티스토리툴바