티스토리 뷰
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/172927
💡 구현 아이디어
- minerals를 5개씩 잘라서 각 곡괭이를 썼을 때의 피로도를 구함
- 사용할 곡괭이를 선별
- 곡괭이가 모자란 경우 - 전부 사용
- 곡괭이가 남는 경우 - 일부만 사용
- 구해진 피로도를 사용할 곡괭이 개수에 맞게 구분한 뒤 돌 곡괭이로 캤을 때의 피로도 기준으로 정렬
- 다이아 → 철 → 돌 곡괭이를 사용하는 순서로 사용된 피로도 계산
💻 코드
import Foundation
func solution(_ picks:[Int], _ minerals:[String]) -> Int {
var result: Int = 0 // 결과값
// lifes[idx][pick] = idx번째 pick 곡괭이를 썼을때의 피로도
// (pick: 0~2) - 0: 다이아, 1: 철, 2: 돌
/*
1번 예시
3다이아, 2철 : [0][0] = 5, [0][1] = 17, [0][2] = 80
1다이아, 1철, 1돌 : [1][0] = 3, [1][1] = 7, [1][2] = 31,
*/
var lifes: [[Int]] = []
for (idx, mineral) in minerals.enumerated() {
if lifes.count < (idx/5+1) { lifes.append([0, 0, 0]) }
if mineral == "diamond" {
lifes[idx/5][0] += 1
lifes[idx/5][1] += 5
lifes[idx/5][2] += 25
} else if mineral == "iron" {
lifes[idx/5][0] += 1
lifes[idx/5][1] += 1
lifes[idx/5][2] += 5
} else {
lifes[idx/5][0] += 1
lifes[idx/5][1] += 1
lifes[idx/5][2] += 1
}
}
// 사용할 곡괭이 선별
var usePicks: [Int] = [0, 0, 0]
if picks.reduce(0, +) <= lifes.count { // 곡괭이가 모자란 경우 - 전부 사용
usePicks = picks
} else { // 곡괭이가 남는 경우 - 일부만 사용
var pickNum = 0 // 현재까지 선별한 곡괭이 개수
for (idx, pick) in picks.enumerated() {
if pick < lifes.count - pickNum { // 해당 곡괭이를 전부 골라도 개수를 넘지 않음
pickNum += pick
usePicks[idx] = pick
} else { // 해당 곡괭이 중 일부만 골라야함
usePicks[idx] = lifes.count - pickNum
pickNum += lifes.count - pickNum // 모자란 개수만 선택
}
}
}
var sortedLifes: [[Int]] = []
for i in 0..<usePicks.reduce(0, +) {
sortedLifes.append(lifes[i])
}
sortedLifes = sortedLifes.sorted {
return $0[2] > $1[2]
}
var idx: Int = 0
for i in idx..<idx+usePicks[0] {
result += sortedLifes[i][0]
}
idx += usePicks[0]
for i in idx..<idx+usePicks[1] {
result += sortedLifes[i][1]
}
idx += usePicks[1]
for i in idx..<idx+usePicks[2] {
result += sortedLifes[i][2]
}
return result
}
❌ 틀린 이유 및 틀린 부분
⏳ 시간 복잡도
기본적인 광물에 접근하는 시간복잡도는 O(N) 이지만 중간 정렬에 의해 O(N^2)까지 증가
📌 풀이 또는 기억할 정보
- 머리속의 내용을 구현하는데 있어서 어려움이 있었던 문제
'PS > 문제 풀이' 카테고리의 다른 글
| [프로그래머스/Swift] 60057번 - 문자열 압축 (0) | 2025.04.23 |
|---|---|
| [프로그래머스/Swift] 134239번 - 우박수열 정적분 (0) | 2025.04.22 |
| [프로그래머스/Swift] 12946번 - 하노이의 탑 (0) | 2025.04.16 |
| [프로그래머스/Swift] 388351번 - 유연근무제 (0) | 2025.04.14 |
| [프로그래머스/Swift] 81302번 - 거리두기 확인하기 (0) | 2025.04.13 |
