오늘 풀어본 문제~!~!
https://school.programmers.co.kr/learn/courses/30/lessons/135808
코딩테스트 연습 - 과일 장수
과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다. 한 상자에 사과를 m개씩 담아 포장합니다. 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다. 과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다) 예를 들어, k = 3, ...
school.programmers.co.kr
프로그래머스의 과일 장수 문제였다.
긴말하지 않고 오늘은 처음 내가 코딩했던 코드를 보면
class Solution {
fun solution(k: Int, m: Int, score: IntArray): Int {
var answer = 0
var scoreList = score.sortedDescending().toMutableList()
while (scoreList.size >= m) {
val minValue = scoreList[m - 1] // m번째로 큰 값을 선택
for (i in 0 until m) {
scoreList.removeAt(0)
}
answer += minValue * m
}
return answer
}
}
이렇게 작성을 했는데, 입력받은 배열을 먼저 내림차순으로 정렬한 후에 새로운 리스트 형태로 만들어주고, m개만큼씩 나눠서 점수를 계산해야하니 그만큼 while문을 돌려서 리스트를 하나씩 지우고, 최솟값에 m을 곱해서 답을 구해주는 방법을 선택했다.
고민을 해보고 결정한 방법이지만 다풀고보니 효율적이지 않아보였고, 하지만 그래도 몇가지 입출력을 하는데에는 별다른 문제가 생기지 않았다.
하지만 반복문을 쓸대없이 많이 써서 그런가 입력받는 값이 커지면 시간초과가 나오는 문제들이 몇개 있었다. 그리고 어떻게 하면 시간을 줄일 수 있을까 고민해보고, 그 결과 요즘 자주 쓰는 forEach()를 사용해보기로 했다.
class Solution {
fun solution(k: Int, m: Int, score: IntArray): Int {
var answer: Int = 0
score.sortDescending()
var num =0
score.forEach{
num+=1
if(num%m == 0){
answer+= it*m
}
}
return answer
}
}
위는 다시짠 코드이다. 배열을 내림차순으로 정렬한 후에, 굳이 리스트로 바꾸고, 지우고 하는 필요없는 부분들은 생략하고, 내가 원하는 위치의 값을 구해 it*m을 answer에 넣어준 후에 return해줬다.
예를 들어, k=3, m=4, 배열이 [2,3,2,1,3,2,1,1] 이렇게 주어졌으면 정렬한후에는 [3,3,2,2,1,1,1] 이렇게 정렬될것이고, m=4만큼 나눠주면 [3,3,2,2], [1,1,1] 두가지로 나뉠텐데 뒤에는 크기가 작으므로 지워주면 [3,3,2,2]만 남게 될것이다. m=4이고, 3번째 인덱스의 값을 구해서 m(4)만큼 곱해주면 될것같다고 생각했다.
그래서 num변수를 생성해주고, forEach()를 이용해서 각 인덱스 값들 하나씩 지날때마다 1씩 더해줘서 num이m과 같아질때 그때의 it(이때는 2가 된다)과 m을 곱해줘서 결과를 구해줬다.
사전캠프기간부터 약 한달이 넘는 기간동안 이런저런 문제들을 풀면서 코틀린의 기초, 기본들은 어느정도 익숙해졌다. 하지만 여전히 부족하다고 느끼는 것은 문제 푸는 방식이다.
누군가가 이건 이런형식으로 선언해서 이렇게 풀어! 하면 잘 풀수 있을것같은데 오늘과 같은 문제를 보면 푸는 방식부터가 잘못 되었고, 너무 오랜 시간이 걸려서 시간초과가 발생하게 되었던것 같다. 앞으로는 조금더 오랜 시간을 투자하더라도, 문제를 어떻게 풀어야 하는가!?? 에 대해서 더 오랜 시간 생각해보고, 정리가 된다면 그 후에 코딩을 시작해야 할것 같다.