[F-Lab 66해빗 페이백 챌린지 ]

[F-Lab 모각코 페이백 39일차] (코테) 프로그래머스 과일 장수 (Java)

everydeveloper 2023. 7. 29. 16:49

학습목표

코테 문제 학습 및 숙달

 

TIL

코테 문제 핵심 및 접근 법

 

 

과일장수

 

문제 설명

 

과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.

  • 한 상자에 사과를 m개씩 담아 포장합니다.
  • 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다.

과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)

예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.

  • (최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8

사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.

 

 

제한사항

  • 3 ≤ k ≤ 9
  • 3 ≤ m ≤ 10
  • 7 ≤ score의 길이 ≤ 1,000,000
  • 이익이 발생하지 않는 경우에는 0을 return 해주세요.

 

 

입출력 예

k m score result
3 4 [1, 2, 3, 1, 2, 3, 1] 8
4 3 [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2] 33

 

입출력 예 설명

입출력 예 #1

  • 문제의 예시와 같습니다.

입출력 예 #2

  • 다음과 같이 사과 상자를 포장하여 모두 팔면 최대 이익을 낼 수 있습니다.
사과 상자 가격
[1, 1, 2] 1 x 3 = 3
[2, 2, 2] 2 x 3 = 6
[4, 4, 4] 4 x 3 = 12
[4, 4, 4] 4 x 3 = 12

따라서 (1 x 3 x 1) + (2 x 3 x 1) + (4 x 3 x 2) = 33 return합니다.

 

 

처음에 문제를 풀려고 GTP4에 문제를 대입해서 넣고 풀려고 하였다.

 

아래는 해당 답변이다.

 

이 문제는 우선순위 큐와 그리디 알고리즘을 이용해 풀 수 있는 문제입니다.

문제를 풀기 위한 핵심 아이디어는 "사과의 점수가 높은 것부터 상자에 넣되, 상자에 들어가는 사과들 중 가장 낮은 점수의 사과가 가장 높은 점수를 가지도록 하면 가장 이익을 많이 낼 수 있다"입니다. 

이를 위해 아래와 같은 방법으로 접근할 수 있습니다:

1. 사과의 점수를 저장하는 우선순위 큐를 생성합니다. 이 때 우선순위 큐는 사과 점수가 높은 것이 우선순위가 높도록 설정합니다.
2. 사과의 점수들을 우선순위 큐에 삽입합니다.
3. 큐가 비거나, 상자에 담을 수 있는 사과의 수(m)만큼의 사과가 남지 않았을 때까지 다음을 반복합니다:
   1. 상자에 담을 사과들을 큐에서 꺼냅니다.
   2. 상자에 담긴 사과들 중 가장 낮은 점수의 사과가 가진 점수를 구합니다.
   3. 해당 점수와 상자에 담긴 사과의 수(m)를 곱하여 이익을 계산하고, 이를 총 이익에 더합니다.
4. 총 이익을 반환합니다.

이 방법을 이용하면 과일 장수가 얻을 수 있는 최대 이익을 효율적으로 계산할 수 있습니다.

 

처음에는 나도 이 문제를 잘 모르고 풀 줄도 몰랐기 때문에 계속 읽고 읽고 하여도도 먼가 분간도 안가고 이해도 안되었다.

그래서 열심히 생각을 더 해서 질문을 더하였다.

 

사과의 점수가 높은 것부터 상자에 넣되, 상자에 들어가는 사과들 중 가장 낮은 점수의 사과가 가장 높은 점수를 가지도록 하면 가장 이익을 많이 낼 수 있다 무슨 말인지 모르겠어

 

죄송합니다, 표현이 다소 혼란스러웠군요. 좀 더 자세하고 쉽게 설명드리겠습니다.

과일 장수가 최대 이익을 얻기 위해서는 사과 상자에 들어가는 사과들 중 '가장 낮은 점수'가 가능한 한 높아야 한다는 것이 핵심입니다. 

왜냐하면, 상자 가격이 상자 안의 사과 중 '가장 낮은 점수'에 기반하기 때문입니다. 그래서 한 상자에 담기는 사과 중 가장 낮은 점수의 사과가 높은 점수를 가질수록, 상자의 가격이 높아지게 됩니다.

예를 들어, 점수가 [1,2,3,4]인 사과 4개를 상자에 담을 때, 가장 낮은 점수는 1점이기 때문에 상자의 가격은 1 x 4 = 4가 됩니다. 하지만 점수가 [2,3,4,4]인 사과 4개를 상자에 담을 때는, 가장 낮은 점수가 2점이므로 상자의 가격은 2 x 4 = 8이 됩니다. 같은 수의 사과를 팔았지만 후자의 경우가 더 많은 이익을 얻게 됩니다.

따라서, 가능한 한 높은 점수의 사과들을 먼저 상자에 담고, 그 중에서도 가장 낮은 점수의 사과가 가능한 한 높은 점수를 가지도록 상자를 구성하면 가장 많은 이익을 낼 수 있습니다.

 

 

여기서 m이 뭐야?

 

이 문제에서 m은 한 상자에 들어가는 사과의 수를 나타내는 변수입니다. 즉, 각 상자에는 m개의 사과를 담아 포장해야 한다는 것을 의미합니다. 예를 들어, m이 4라면, 각 상자에는 4개의 사과를 담아서 판매해야 한다는 뜻입니다. 

이때, 상자에 담긴 사과 중 가장 낮은 점수가 p점이면, 그 상자의 가격은 p * m이 됩니다. 이 문제의 목표는 가능한 많은 사과를 팔아 최대한의 이익을 얻는 것입니다. 이는 상자에 담는 사과들 중 가장 낮은 점수의 사과가 가능한 한 높은 점수를 가질수록, 더 많은 이익을 얻을 수 있음을 의미합니다.

 

 

가격 곱하기 갯수가 당연히 판매액인데 왜 그런 말을 하지?

 

"가격 곱하기 갯수"는 한 상자의 가격을 계산하는 방법을 설명한 것입니다. 문제에서는 각 상자의 가격이 "상자에 담긴 사과 중 가장 낮은 점수(p) * 상자에 담긴 사과의 개수(m)"로 결정된다고 명시하고 있습니다. 따라서, 같은 개수의 사과를 담은 상자라도, 그 중 가장 낮은 점수의 사과의 점수에 따라 가격이 달라집니다.

이 문제의 핵심은 어떤 사과를 어떤 순서로 상자에 담을 것인가를 결정하는 것입니다. 왜냐하면, 이 결정에 따라 각 상자에 담긴 사과 중 가장 낮은 점수가 달라지며, 따라서 상자의 가격이 달라질 수 있기 때문입니다. 이를 통해 가능한 많은 이익을 얻을 수 있는 최적의 방법을 찾는 것이 이 문제의 목표입니다. 

즉, "가격 곱하기 갯수가 판매액"이라는 말은 한 상자를 팔 때 얻는 이익을 의미하며, 이를 최대화하는 방법을 찾는 것이 이 문제의 핵심입니다.

 

 

그 배열에 갯수가 다르게 입력되어 있고 순서가 달라서 가격이 다른가?

 

네, 맞습니다. 문제에서 주어진 score 배열의 순서와 개수는 과일 장수가 얻을 수 있는 이익에 영향을 미칩니다.

"사과 상자를 포장할 때, 사과들의 점수 순서가 어떠냐에 따라, 상자에 담긴 사과 중 가장 낮은 점수가 달라지므로, 이에 따라 상자의 가격도 달라집니다. 이로 인해 과일 장수가 얻을 수 있는 이익이 달라집니다."

예를 들어, k = 3, m = 3, score = [3, 2, 1] 일 때, 점수가 높은 사과를 먼저 상자에 넣는다면, [3, 2, 1]로 상자를 포장할 수 있습니다. 이 때 가장 낮은 점수가 1이므로 상자의 가격은 1 * 3 = 3이 됩니다.

반대로, 점수가 낮은 사과를 먼저 상자에 넣는다면, [1, 2, 3]로 상자를 포장할 수 있습니다. 이 때 가장 낮은 점수가 1이지만, 이후에 높은 점수의 사과를 넣으므로 상자의 가격은 1 * 3 = 3이 됩니다.

따라서, 어떤 순서로 사과를 상자에 담느냐에 따라 과일 장수가 얻을 수 있는 이익이 달라질 수 있습니다.

 

나는 최저 사과점수를 알겠고 한사장에 담긴 사과 개수도 알겠고 상자의 갯수도 알겠는데 왜 가격이 달라질 수 있는거야?

 

제가 설명을 다시 조정해보겠습니다. 

이 문제에서 사과 상자의 가격은 '상자에 담긴 사과 중 가장 낮은 점수'에 '상자에 담긴 사과의 수'를 곱한 값이 됩니다. 

즉, 가격이 결정되는 핵심 요소는 '상자에 담긴 사과 중 가장 낮은 점수'입니다. 그래서 여러분은 가능한 가장 높은 점수의 사과로 상자를 채워야 최대 이익을 얻을 수 있습니다. 

예를 들어, m이 3일 때, [3, 2, 1]이라는 점수 배열이 주어진다면, [3, 3, 2] 형태로 상자를 채우는 것이 가장 이익이 많을 것입니다. 왜냐하면 이 경우, 가장 낮은 점수가 2이기 때문에 상자 가격은 2*3=6이 됩니다. 반면, [3, 2, 1] 형태로 상자를 채우면, 가장 낮은 점수가 1이므로 상자 가격은 1*3=3이 됩니다. 따라서 어떤 사과를 먼저 상자에 담느냐에 따라 판매가격이 달라집니다.

이런 식으로 접근하는 이유는, 가장 점수가 높은 사과로 상자를 채우면, 해당 상자의 가장 낮은 점수가 더 높아질 수 있기 때문입니다. 이렇게 하면 전체 판매 가격을 높일 수 있습니다.

 

이거 상자가 여러개 인가?

네, 맞습니다. 문제에서는 사과를 한 상자에 m개씩 담아 판매한다고 했습니다. 따라서 사과의 총 개수에 따라 만들 수 있는 상자의 개수는 다양합니다. 

예를 들어, 사과가 10개 있고 m이 4라면, 사과를 2개의 상자에 나누어 담을 수 있습니다. 하지만 가장 높은 이익을 얻기 위해서는 각 상자에 어떤 사과를 담아야 하는지를 결정해야 합니다. 이때, 상자 가격은 '상자에 담긴 사과 중 가장 낮은 점수'에 '상자에 담긴 사과의 수'를 곱한 값이기 때문에, 가능한 한 높은 점수의 사과로 상자를 채워야 합니다. 

이런 방식으로 접근하면 여러 개의 상자에 사과를 나누어 담아도 최대 이익을 얻을 수 있습니다.

 

 

나 문제가 이해가 아직 안돼

알겠습니다, 문제를 좀 더 자세히 설명해드리겠습니다. 

기본적으로 이 문제는 "과일장수"가 판매할 사과를 어떻게 상자에 담느냐에 따라 얼마의 이익을 얻을 수 있을지를 계산하는 문제입니다. 사과는 1점부터 k점까지의 점수를 가지고 있으며, 상자 하나에는 m개의 사과가 들어갑니다. 

그런데 사과 상자 하나의 가격은 "상자에 담긴 사과 중 가장 낮은 점수"와 "상자에 담긴 사과의 수"를 곱한 값으로 결정됩니다. 즉, 사과 상자의 가격은 "가장 점수가 낮은 사과의 점수 * 상자에 담긴 사과의 수"가 됩니다.

따라서 가장 많은 이익을 얻기 위해서는 "가장 점수가 낮은 사과의 점수"가 가능한 한 높게, 그리고 가능한 한 많은 상자를 판매하게 해야 합니다. 이를 위해 과일장수는 사과의 점수가 높은 것부터 상자에 담습니다. 만약 m개의 사과를 담을 수 있는 상자를 만드는데 사과가 부족하면, 남은 사과는 버립니다.

예를 들어, k가 3, m이 4이고 사과의 점수가 [1, 2, 3, 1, 2, 3, 1]인 경우, 사과의 점수를 내림차순으로 정렬하면 [3, 3, 2, 2, 1, 1, 1]이 됩니다. 이 중에서 4개의 사과를 선택하여 상자에 담으면, [3, 3, 2, 2]가 됩니다. 이 상자의 가격은 가장 낮은 점수인 2와 사과의 수인 4를 곱한 8이 됩니다. 이렇게 하면 최대 이익을 낼 수 있습니다.

이 문제를 해결하기 위한 핵심은 "가장 낮은 점수의 사과"가 가능한 한 점수가 높도록 사과를 선택하고, 그렇게 만들 수 있는 최대의 상자를 판매하는 것입니다. 이를 통해 과일장수는 최대 이익을 얻을 수 있습니다.

 

[3,3,2,1,1]이 [3, 3, 2, 2]되는 이유와 과정 알려줘

 

죄송합니다, 제 설명에 잘못이 있었습니다. 사과의 점수를 내림차순으로 정렬하면 [3, 3, 2, 2, 1, 1, 1]이 되고, 여기서 4개의 사과를 선택하여 상자에 담는 것은 맞습니다. 하지만 선택하는 사과는 점수가 높은 순서대로 4개인 [3, 3, 2, 2]가 아니라 점수가 낮은 순서대로 4개인 [2, 1, 1, 1]이어야 합니다. 이유는 상자의 가격이 "상자에 담긴 사과 중 가장 낮은 점수 * 상자에 담긴 사과의 수"로 결정되기 때문입니다.

이 상자의 가격은 "가장 낮은 점수인 1"과 "사과의 수인 4"를 곱한 4가 됩니다. 

사과의 점수가 높은 것부터 상자에 담는 것이 아니라, 상자 안의 사과 중 가장 낮은 점수가 높은 것을 상자에 담는 것이 이 문제의 핵심입니다. 이렇게 하면 가장 높은 이익을 얻을 수 있습니다. 

예를 들어, [3, 3, 2, 1, 1, 1]에서 [3, 3, 2, 2]를 선택하면 가장 낮은 점수는 2이므로 상자의 가격은 2 * 4 = 8이 됩니다. 이 경우는 4개의 사과를 상자에 담았지만 가장 낮은 점수가 2이므로 이익은 8이 됩니다.

반면에, [3, 3, 2, 1, 1, 1]에서 [2, 1, 1, 1]을 선택하면 가장 낮은 점수는 1이지만 상자의 가격은 1 * 4 = 4가 됩니다. 이 경우는 4개의 사과를 상자에 담았지만 가장 낮은 점수가 1이므로 이익은 4가 됩니다.

따라서 상자에 사과를 담는 방법에 따라 과일장수가 얻을 수 있는 이익이 달라집니다. 이 문제는 그런 상황에서 가장 높은 이익을 얻는 방법을 찾는 것입니다.

[3, 3, 2, 1, 1, 1]에서 [2, 1, 1, 1]을 선택하면 가장 낮은 점수는 1이지만 여기서 가장 낮은 점수가 1인것은 알겠어 하지만 "[3, 3, 2, 1, 1, 1]에서 [2, 1, 1, 1]을 선택하면" 이라는 선택하는 기준이 뭐야??

선택의 기준은 "상자에 담긴 사과 중 가장 낮은 점수가 가장 높도록"입니다. 이것이 어떤 의미냐면, 담는 사과의 점수를 최대한 높게 유지하면서도 상자 내부의 사과 중 가장 낮은 점수가 최대한 높게 유지되어야 한다는 것입니다.

사과의 점수가 [3, 3, 2, 1, 1, 1]라고 할 때, 상자에 4개를 담을 수 있다고 가정해 봅시다. 이 때 상자에 사과를 담는 방법은 여러 가지가 있을 수 있습니다. 

예를 들어, [3, 3, 2, 2]를 선택할 수도 있고, [3, 3, 2, 1]을 선택할 수도 있고, [2, 1, 1, 1]을 선택할 수도 있습니다.

하지만 상자의 가격은 "상자에 담긴 사과 중 가장 낮은 점수 * 상자에 담긴 사과의 수"로 결정되기 때문에, 가장 낮은 점수를 최대한 높게 유지해야 합니다.

그래서 [3, 3, 2, 1, 1, 1]에서 [2, 1, 1, 1]을 선택하는 것입니다. 왜냐하면 이 경우에는 상자에 담긴 사과 중 가장 낮은 점수가 1이지만, 이것이 가장 높은 가격을 만들어낼 수 있기 때문입니다. 

이렇게 해서 선택된 사과는 다음과 같이 됩니다: [2, 1, 1, 1]. 이때 가장 낮은 점수는 1이므로 상자의 가격은 1 * 4 = 4가 됩니다.

이와 같이 "상자에 담긴 사과 중 가장 낮은 점수가 가장 높도록" 선택하면, 과일장수가 얻을 수 있는 최대 이익을 구할 수 있습니다. 이러한 방법이 이 문제에서 요구하는 해결 방법입니다.

 

 

어제 사실 이런 채팅을 하다가 도저히 이해도 안되고 이해 될 기미도 안보여서 그냥 종료하고 다른 일을 하였다.오늘 정리 겸 해결 해야해서 다시 보니 어제는 잘 안되었는데 오늘은 잠깐 봤는데 바로 이해되었다.

 

내가 생각한 문제 풀이법은 이렇다.

일단 여러개의 사과가 있고 가격은 한 상자에 있는 최저 퀄리티 하나라도 있는 사과에 따라 달라진다.

그래서 최저 가격의 사과를 최대한 한 상자에 다 모아서 다른 상자의 가격을 높여서 합이 매출이 가장 높게 해야한다.

왜냐면 최저 퀄리티의 사과는 한개는 무조건 있기 마련인데 그런 것들이 다른 곳에 가게되면 매출이 최대가 안된다.

그래서 최저 정도되는 낮은 퀄리티의 사과들을 다 모아서 매출을 최대한 낮게 하고 나머지 사과들이 자동적으로 가격이 높게 책정되니 이렇게 하면 매출이 높게 될 것이다.

 

이걸 알고리즘 코딩테스트 문제로 바꿔서 풀면 된다.

 

오늘 이렇게 이해한 것으로 다시 질문 하였다.

 

 

이게 여러 상자가 나오니까 제일 낮은 퀄의 사과들을 우선적으로 다 모아서 최소한으로 제일 작은 가격의 상자를 만들고 나머지 가격이 좀 나가는 사과 상자들로 매출을 내야겠구나 왜냐면 제일 작은 사과들이 한두개씩 다른 상자에 들어가면 이것이 문제에서 정한 규칙때문에 다른 퀄있는 사과들이 더 많더라도 최저 가격으로 잡혀버리니 그렇게 하는 것이 맞겠네 그러면 이제 코드를 짜면 되겠네 자바 코드 짜줘!

이 문제를 해결하는 한 가지의 방법은 사과의 점수에 따라 사과들을 정렬하고, 점수가 낮은 사과부터 상자에 담는 것입니다. 이렇게 하면 점수가 낮은 사과들이 먼저 상자에 들어가므로 가장 낮은 가격의 상자를 먼저 만들 수 있습니다. 그리고 점수가 높은 사과들로 만든 상자는 가격이 더 높아지므로 이익을 최대화할 수 있습니다.

이 방법을 Java 코드로 구현해보겠습니다:

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        int k = 4;
        int m = 3;
        int[] scores = {4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2};
        System.out.println(solution(k, m, scores));
    }

    public static int solution(int k, int m, int[] scores) {
        // Create a priority queue to store the scores in decreasing order
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());

        // Add the scores to the queue
        for (int score : scores) {
            pq.add(score);
        }

        int result = 0;

        // While there are enough apples to fill a box
        while (pq.size() >= m) {
            // Get the lowest score in the next box
            int minScore = Integer.MAX_VALUE;

            // Fill the box with m apples
            for (int i = 0; i < m; i++) {
                int score = pq.poll();
                minScore = Math.min(minScore, score);
            }

            // Update the total score
            result += minScore * m;
        }

        return result;
    }
}

 

 


이 코드는 점수가 높은 사과부터 상자에 담아나가는 방식으로 작동합니다. 이 때, 우선순위 큐를 사용하여 사과들의 점수를 내림차순으로 정렬하고, 상자에 사과를 담을 때는 큐의 맨 앞에 있는 사과부터 담아나갑니다. 이렇게 하면 점수가 높은 사과부터 상자에 담아나가면서 상자 가격을 최대로 만들 수 있습니다. 상자를 다 채우면 그 상자의 가격을 총 가격에 더하고, 이 과정을 사과가 부족해 상자를 채울 수 없을 때까지 반복합니다. 이렇게 계산된 총 가격이 이 문제의 답이 됩니다.

 

 

메인 클래스가 있고 코테로직 부분이 있는데 약간 구성만 다르게 해서 프로그래머스에 입력하니 문제가 한번에 풀렸다.

실제 아래는 프로그래머스에 입력한 코드다

 

import java.util.*;

class Solution {
    public int solution(int k, int m, int[] scores) {
 
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());

        for (int score : scores) {
            pq.add(score);
        }

        int result = 0;

       
        while (pq.size() >= m) {
            
            int minScore = Integer.MAX_VALUE;

            
            for (int i = 0; i < m; i++) {
                int score = pq.poll();
                minScore = Math.min(minScore, score);
            }

            
            result += minScore * m;
        }

        return result;
    }
}

 

채점을 시작합니다.
정확성 테스트
테스트 1 통과 (1.65ms, 74.7MB)
테스트 2 통과 (0.60ms, 82.9MB)
테스트 3 통과 (1.23ms, 74.8MB)
테스트 4 통과 (1.11ms, 78.9MB)
테스트 5 통과 (1.36ms, 80.1MB)
테스트 6 통과 (28.37ms, 85.6MB)
테스트 7 통과 (24.45ms, 82.8MB)
테스트 8 통과 (11.24ms, 81.4MB)
테스트 9 통과 (39.43ms, 106MB)
테스트 10 통과 (29.02ms, 80.6MB)
테스트 11 통과 (259.51ms, 144MB)
테스트 12 통과 (233.84ms, 142MB)
테스트 13 통과 (233.19ms, 138MB)
테스트 14 통과 (268.67ms, 143MB)
테스트 15 통과 (237.22ms, 141MB)
테스트 16 통과 (0.41ms, 73.3MB)
테스트 17 통과 (0.60ms, 66.6MB)
테스트 18 통과 (0.81ms, 72.9MB)
테스트 19 통과 (0.82ms, 71.9MB)
테스트 20 통과 (1.15ms, 71.3MB)
테스트 21 통과 (0.55ms, 79.7MB)
테스트 22 통과 (0.51ms, 78.6MB)
테스트 23 통과 (0.44ms, 77.2MB)
테스트 24 통과 (0.52ms, 74.8MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0

 

통과하였다.

 

 

사용된 알고리즘을 알아보니

이 문제의 해결 방법은 우선순위 큐(Priority Queue)라는 자료 구조와 그리디 알고리즘(Greedy Algorithm)을 사용했습니다.

우선순위 큐(Priority Queue)는 일반적인 큐와는 달리 우선순위가 가장 높은 요소가 가장 먼저 나오는 자료구조입니다. 이 문제에서는 사과의 점수를 기준으로 우선순위 큐를 구성하여 점수가 높은 사과를 먼저 뽑아서 사용했습니다.

그리디 알고리즘(Greedy Algorithm)은 문제 해결의 각 단계에서 그 순간에 최적이라고 생각되는 결정을 하는 방법론입니다. 이 문제에서는 그리디 알고리즘을 사용하여 현재 상자에 들어갈 수 있는 가장 높은 점수의 사과를 선택하는 방식으로 최대 이익을 도출했습니다.

이 두 가지 방법을 조합하여 이 문제를 효율적으로 해결할 수 있습니다.

 

그리디 알고리즘이 사용되었고 우선순위 큐가 사용되었다.

 

AI도 본의 아니게 거짓말(할루시네이션)을 하니 참고해서 해야겠다.