RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Algorithm/프로그래머스

[프로그래머스>Lv3] 인사고과 - kotlin

2023. 2. 9. 20:48
728x90
반응형
 

프로그래머스

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

programmers.co.kr

 

1. 문제

각 사원마다 근무 태도 점수와 동료 평가 점수가 기록되어 있는데

만약 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한 번이라도 있다면 그 사원은 인센티브를 받지 못합니다. 😭

 

그렇지 않은 사원들에 대해서는 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됩니다.

이 때, 두 점수의 합이 동일한 사원들은 동석차이며, 동석차의 수만큼 다음 석차는 건너 뜁니다.

 

[입력]

각 사원의 근무 태도 점수와 동료 평가 점수 목록 scores

 

[출력]

원호의 석차를 return

 

2. 제한사항

  • 1 <= scores의 길이 <=100,000
  • [근무 태도 점수, 동료 평가 점수]
  • scores[0]이 원호의 점수
  • 원호가 인센티브를 받지 못하는 경우 -1을 return 합니다.

 

3. 풀이

흠. 일단 직접 실행해 봤는데 2중 for문은 시간초과가 발생한다.

그렇다면 어떻게 풀 수 있을까?

 

비교해야 할 사항이 근무 태도 점수(앞으로 x 좌표)와 동료 평가 점수(앞으로 y 좌표)가 있습니다.

먼저 조건이 2개이므로 비교해야할 사항을 하나로 줄이기 위해 x 좌표를 기준으로 내림차순 정렬을 먼저 해주겠습니다.

( * 이 때, x좌표가 동일한 경우, y 좌표를 기준으로 오름차순 정렬해줍니다.

// 0을 기준으로 내림차순, 1을 기준으로 오름차순
val temp = scores.sortedWith(compareBy({ -it[0] }, { it[1] }))

 

이렇게 정렬했을 경우, 아래 좌표처럼 볼 수 있습니다.

여기서 한 가지 사항을 더 확인할 수 있습니다.

🌹 자신의 오른쪽에 있는 좌표 중 자신보다 y좌표가 큰 좌표가 하나라도 있다면 그 사람은 인센티브를 받을 수 없습니다.

 

그렇다면 자신의 오른쪽에 있는 좌표 중에서 가장 큰 y좌표와 자신의 y좌표를 비교해서

자신의 y 좌표가 작다면 자신은 인센티브를 받을 수 없다는 의미입니다.

이를 코드로 구현하면 아래와 같습니다. 👇🏻

var maxHeight = 0
val ables = mutableListOf<Int>()

var ableOfMe = false // 원호가 받는 것이 가능한가?
temp.forEach { (x, y) ->
    if (y >= maxHeight) { // 성과급 받는 것이 가능
        ables.add(x + y)
        maxHeight = y
        // 원호가 받는 것이 가능
        if (x == meX && y == meY) ableOfMe = true
    }
}
🌹 여기서 meX와 meY는 원호의 근무 태도 점수와 동료 평가 점수입니다.

 

이제 인센티브를 받을 수 있는 사람들을 뽑았습니다.

다음으로는

  1. (근무 태도 점수 + 동료 평가 점수) 순으로 내림차순 정렬한 후, 등수를 매긴다.
  2. 원호의 점수(meX + meY)일 때의 등수를 반환한다.

 

위 1,2를 수행하면 결과를 얻을 수 있습니다.

( * 코드는 아래에🤗)

 

4. 코드

kotlin
class Solution {
    fun solution(scores: Array<IntArray>): Int {
        val (meX, meY) = scores.first()

        // 0을 기준으로 내림차순, 1을 기준으로 오름차순
        val temp = scores.sortedWith(compareBy({ -it[0] }, { it[1] }))
        var maxHeight = 0
        val ables = mutableListOf<Int>()

        var ableOfMe = false // 원호가 받는 것이 가능한가?
        temp.forEach { (x, y) ->
            if (y >= maxHeight) { // 성과급 받는 것이 가능
                ables.add(x + y)
                maxHeight = y
                // 원호가 받는 것이 가능
                if (x == meX && y == meY) ableOfMe = true
            }
        }

        val target = meX + meY
        if (ableOfMe.not()) return -1
        
        var count = 1
        ables.groupBy { it }
            .map { it.key to it.value.size }
            .sortedBy { -it.first }
            .forEach {
                if (it.first == target) return count
                count += it.second
            }
        return -1
    }
}

 

 

 

반응형

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스 > Lv1] 카드뭉치  (0) 2023.02.16
[프로그래머스 > Lv3] 표현 가능한 이진트리  (0) 2023.02.10
[프로그래머스>Lv2] 호텔 대실 - kotlin, python  (0) 2023.02.08
[프로그래머스>Lv1] 둘만의 암호 - kotlin & python  (0) 2023.02.03
[프로그래머스>Lv2] 뒤에 있는 큰 수 찾기 - Kotlin  (0) 2023.02.03
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스 > Lv1] 카드뭉치
    • [프로그래머스 > Lv3] 표현 가능한 이진트리
    • [프로그래머스>Lv2] 호텔 대실 - kotlin, python
    • [프로그래머스>Lv1] 둘만의 암호 - kotlin & python
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바