본문 바로가기

알고리즘 & 문제풀이

프로그래머스 - L1 과일장수

해당 규칙에서 최대 이익을 얻기 위해서 score를 크기 순으로 정렬하여, 가치가 높은 순부터 포장을 하면 된다고 생각하고, 코드 작성을 했습니다.

반복문으로 진행 할 텐데 반복문의 break 기준과 이익을 계산하는 기준 선정이 필요했습니다.

git : 과일장수

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/135808


문제 풀이

∙ score 올림차순 정렬 진행 sortedScore 할당

∙ 반복문을 통해 sortedScore에서 pop

∙ 반복문을 진행하면서 index 정보를 가지고 있어 index == 담는 개수가 사과 box가 완성되는 시점이며, 해당 box에서 가장 낮은 가치는 마지막 담은 사과

∙ box의 가치를 계산 후 resultBenfit 더 해주기

// k : 최고등급
// m : 담는 개수
// score : 사과

func solution(_ k:Int, _ m:Int, _ score:[Int]) -> Int {
    var resultBenifit: Int = 0
    var sortedScore: [Int] = []
    sortedScore = score.sorted()
    var index: Int = 1

    while(true) {
        guard let pick = sortedScore.popLast() else {
            break
        }
        print("pick : \(pick) , index : \(index) , \(sortedScore)")
        if(index % m == 0) { // 상자의 마지막 사과
            resultBenifit += (pick * m)
            print("result : \(resultBenifit)")
        }
        index += 1
    }
    return resultBenifit
}

다른 사람 풀이 분석

프로그래머스 - 최은성님

import Foundation

func solution(_ k:Int, _ m:Int, _ score:[Int]) -> Int {
    var answer = 0
    var score = score.sorted{$0 > $1}
    var start = m-1
    while start < score.count {        
        answer += m*score[start]        
        start += m
    }

    return answer
}

∙ 굳이 모든 사과를 pop 할 필요 없이 index로 접근하면 효율적이다.

프로그래머스 - 박인서 , lymchgmk 님

import Foundation

func solution(_ k:Int, _ m:Int, _ score:[Int]) -> Int {
    let s = score.sorted(by: >)
    return stride(from: m-1, to: score.count, by: m)
        .reduce(0) { $0 + s[$1] * m }
}

∙ stride , reduce 함수의 활용