2023. 4. 3. 21:05ㆍ알고리즘/문제
광물 캐기
출처: 프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/172927
풀이
1. 저는 minerals 배열을 5개씩 묶어서 보았습니다.
minerals의 size가 5의 배수다? -> 5개씩 묶은 배열들을 배열에 저장
나머지가 있다? -> 곡괭이의 전체 개수X5 한 값까지만 minerals 배열을 자르고 5개씩 묶어서 저장
다시 말해 곡괭이 1개당 5개의 미네랄을 캘 수 있으니까 곡괭이 전체 개수*5 가 최대로 캘 수 있는 미네랄들의 수입니다.
그래서 미네랄들의 배열이 곡괭이가 캘 수 있는 수를 넘어가면 넘어가는 미네랄은 버리자!
그래서 slice하고 chunked(5)로 묶었습니다.
2. 이제 각 묶음이 가진 다이아몬드 , 철, 돌의 개수를 정리해 배열에 담아 배열 안에 넣어줬습니다.
"diamond", "diamond", "diamond", "iron", "iron" 배열은
intArrayOf(3,2,0) 이렇게 바꾸었습니다.
3. 이제 각 각의 카운트를 담은 배열을 배열에 넣어서 다이아몬드 , 철 , 돌 순으로 정렬 했습니다.
만약 다이아몬드 개수가 같으면 철이 많은거로 정렬하고 이렇게 했습니다.
저는 코틀린이라 sortedWith로 comparedBy로 정렬 하였습니다.
왜 정렬을 하지??
다이아몬드가 많은 배열부터 다이아몬드 곡괭이로 판다고 생각했습니다.
만약, 앞에서 다이아몬드가 적은 곡괭이를 사용한다면 피로도는 절대 최솟값이 될 수 없습니다.
4. 마지막으로 5개씩 묶인 정렬된 배열을 반복문을 통해 하나씩 확인합니다.
내가 다이아몬드 곡괭이가 있으면 다이아몬드 곡괭이로 지금 확인하는 묶음을 해결하고 answer 갱신
다이아몬드는 없고 철 곡괭이가 있으면 철 곡괭이로 계산해서 answer 갱신하고
그것도 없으면 돌 곡괭이로 다이아몬드 개수 answer += 25 + 철5 + 돌*1 갱신하면 됩니다.
생각나는데로 적고 문제는 해결했지만 다른 방법을 더 생각해봐야겠습니다.
코드
class Solution {
fun solution(picks: IntArray, minerals: Array<String>): Int {
var answer: Int = 0
val x = if (minerals.size > picks.sum() * 5) minerals.slice(0 until picks.sum() * 5).toList()
.chunked(5) else minerals.toList().chunked(5)
val arr = Array<IntArray>(x.size) { IntArray(3) }
x.forEachIndexed { index, strings ->
var d = 0
var i = 0
var s = 0
strings.forEach { v ->
when (v) {
"diamond" -> d++
"iron" -> i++
else -> s++
}
}
arr[index][0] = d
arr[index][1] = i
arr[index][2] = s
}
val s = arr.toList().sortedWith(compareBy({ -it[0] }, { -it[1] }, { -it[2] }))
s.forEach {
if (picks[0] != 0) {
answer += it[0] + it[1] + it[2]
picks[0] -= 1
} else if (picks[1] != 0) {
answer += it[0] * 5 + it[1] + it[2]
picks[1] -= 1
} else {
answer += it[0] * 25 + it[1] * 5 + it[2]
picks[2] -= 1
}
}
return answer
}
}
'알고리즘 > 문제' 카테고리의 다른 글
프로그래머스 Level2 연속 부분 수열 합의 개수 (0) | 2023.04.13 |
---|---|
프로그래머스 Level2 예상 대진표 (0) | 2023.04.11 |
프로그래머스 Level 3 순위 (2) | 2023.03.21 |
프로그래머스 Level 2 당구 연습 (2) | 2023.03.21 |
프로그래머스 Level 2 리코쳇 로봇 (4) | 2023.03.19 |