👀 문제
https://school.programmers.co.kr/learn/courses/30/lessons/172927
👊 도전
1. 설계
- 문제 설명대로 구현
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class Solution {
fun solution(t: String, p: String): Int {
var answer: Int = 0
/**
* minerals를 5개씩 잘라서 저장
* 배열별 D I S 갯수 별 내림차순 정렬
* D I S 순으로 picks 차감하면서 계산
*/
// 곡괭이 개수만큼 리스트로 변환
var pickList = arrayOf<String>()
picks.forEachIndexed { index, pick ->
val name = when (index) {
0 -> "diamond"
1 -> "iron"
else -> "stone"
}
repeat(pick) {
pickList += name
}
}
// 광물을 5개씩 자르고 각 개수를 저장
var countArray: Array<IntArray> = arrayOf()
var count = intArrayOf(0, 0, 0)
minerals.forEachIndexed { index, mineral ->
if (index % 5 == 0) {
count = intArrayOf(0, 0, 0)
}
when (mineral) {
"diamond" -> count[0]++
"iron" -> count[1]++
"stone" -> count[2]++
}
if (index % 5 == 4 || index == minerals.lastIndex) {
countArray += count
}
}
// 곡괭이 개수만큼만 쓸 수 있으므로 뒤에 광물은 자른다
if (pickList.size < countArray.size) {
countArray = countArray.slice(IntRange(0, pickList.size - 1)).toTypedArray()
}
// 다이아몬드, 철, 돌 개수 내림차순 정렬
val sortedList = countArray.sortedWith(compareBy({ -it[0] }, { -it[1] }, { -it[2] }))
// 계산
var pickIndex = 0
run loop@{
sortedList.forEach { mineral ->
val name = pickList.getOrNull(pickIndex) ?: return@loop
val diamond = when (name) {
"diamond" -> 1
"iron" -> 5
else -> 25
}
val iron = when (name) {
"diamond" -> 1
"iron" -> 1
else -> 5
}
val stone = 1
val temp = mineral[0] * diamond + mineral[1] * iron + mineral[2] * stone
answer += temp
pickIndex++
}
}
return answer
}
3. 결과
🤟 성공 🤟
4. 설명
-
picks의 곡괭이 각 개수만큼 곡괭이 리스트를 만든다
- minerals를 5개씩 자르고 각 개수를 카운트해서 저장한다
- Array 0, 1, 2번째에 다이아몬드, 철, 돌 개수를 저장한다.
- 5개로 자른 countArray가 곡괭이 수보다 많으면 그만큼 자른다
- 소팅하기 전에 잘라야한다.
- 곡괭이가 부족하므로 뒤에는 어짜피 할 수 없다.
- 다이아몬드, 철, 돌이 많은 순으로 내림차순 정렬한다
- 다이아몬드가 많은 것 부터 다이아몬드 곡괭이로 자르는 것이 이득이기 때문이다.
- 다이아몬드, 철, 돌이 많은 순으로 내림차순 정렬한다
- 다이아몬드가 많은 것 부터 다이아몬드 곡괭이로 자르는 것이 이득이기 때문이다.
- pickList를 뽑으면서 정렬된 countArray를 계산한다