프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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는 원호의 근무 태도 점수와 동료 평가 점수입니다.
이제 인센티브를 받을 수 있는 사람들을 뽑았습니다.
다음으로는
- (근무 태도 점수 + 동료 평가 점수) 순으로 내림차순 정렬한 후, 등수를 매긴다.
- 원호의 점수(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 |