티스토리 뷰

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/172927

💡 구현 아이디어

  1. minerals를 5개씩 잘라서 각 곡괭이를 썼을 때의 피로도를 구함
  2. 사용할 곡괭이를 선별
    • 곡괭이가 모자란 경우 - 전부 사용
    • 곡괭이가 남는 경우 - 일부만 사용
  3. 구해진 피로도를 사용할 곡괭이 개수에 맞게 구분한 뒤 돌 곡괭이로 캤을 때의 피로도 기준으로 정렬
  4. 다이아 → 철 → 돌 곡괭이를 사용하는 순서로 사용된 피로도 계산

💻 코드

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)까지 증가

📌 풀이 또는 기억할 정보

  • 머리속의 내용을 구현하는데 있어서 어려움이 있었던 문제
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
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
글 보관함