해당 문제가 그리디 알고리즘으로 푼다는 풀이들이 많아서 의문이 생겨 질문을 남깁니다
이 문제에서 5개의 광물을 처리할 때, 각 광물에 맞는 최적의 곡괭이를 선택해야 피로도를 최소화할 수 있습니다. 예를 들어, 5개의 광물 중 철이 가장 많이 나온다면, 철 곡괭이를 사용하는 것이 가장 효율적입니다. 그러나 철 곡괭이가 없고 다이아몬드 곡괭이1개, 돌 곡괭이 1개 만 있다고 하였을때 다이아몬드 곡괭이 또는 돌 곡괭이 중 하나를 선택해야 하는 상황이 발생합니다.
이때, 다이아몬드 곡괭이를 선택하여 5개의 광물을 처리했을 경우, 이후 5개의 광물에서 다이아몬드 광물이 많이 나온다면 최적의 해를 보장할 수 없게 됩니다. 따라서, 그리디 알고리즘으로 현재 상황에서 가장 좋은 선택을 했다고 하더라도, 이후 상황에 따라 이 선택이 최적의 해가 아닐 수 있습니다.
저는 이러한 이유로 그리디 알고리즘이 항상 최적의 해를 보장하는지에 대해 의문을 가지고 있습니다. 만약 이 문제를 그리디 알고리즘으로 풀었을 때 정답으로 인정된다면, 문제 자체가 최적의 해를 보장하지 못할 가능성이 있는 잘못된 문제가 아닌가 하는 질문을 드립니다.
제 질문이 잘못되었다면 지적 부탁드립니다 ㅠㅠ
다른 분들의 그리디 풀이 방법을 보니 광물 자원의 value를 계산하고 정렬 한 후 최대 값에 맞는 곡괭이를 사용하는 방식인 것 같습니다.
그러므로 질문자님께서 의문을 가지는 경우는 생기지 않을 것으로 보입니다.
왜냐하면 정렬을 해서 value가 큰 경우부터 이미 가장 좋은 곡괭이를 사용하기 때문에 철 광물 5개가 남은 후 다음 경우에는 다이아 광물이 나오는 경우가 없기 때문입니다.
value를 비교하는 부분에서 조금 더 설명을 드리면
다이아, 철, 돌 곡괭이가 광물을 캐는 부분에서 5배 차이나고, 광물은 5개 단위로 캐기 때문에 어떻게 하던 다이아 광물이 하나라도 포함된 경우와 다이아 광물이 하나도 포함되지 않은 조합을 비교했을 때 다이아 광물이 포함된 경우에 좋은 곡괭이를 사용하는게 이득입니다.
극단적인 예로 [다이아] [철,철,철,철,철] 을 비교할 경우
다이아, 철, 돌 곡괭이를 비교해 보겠습니다.
다이아1
1, 5, 25
철5
5, 5, 25
위와 같은 피로도가 됩니다. 이를 통해 [다이아가 하나라도 포함된 경우]와 [다이아가 포함되지 않은 경우]를 비교했을 때, [다이아가 하나라도 포함된 경우]에 좋은 곡괭이를 쓰는 게 무조건 이득이라는 것을 알 수 있습니다.
그러므로 이러한 방법으로 그리디하게 문제를 풀 수 있습니다.
근데 광물을 캘 수 있는 순서는 정해져있는거 아닌가요? "문제조건에 광물은 주어진 순서대로만 캘 수 있습니다." 이렇게 적혀있어서요 철 광물 5개가 남은 후 다음 경우에는 다이아 광물이 나오는 경우가 생길 수 있는거 아닌가요 ?? 제가 잘 이해를 못해 죄송합니다 ㅜ
말씀하신 대로 광물을 캘 수 있는 순서는 정해져 있습니다. 하지만, 그에 맞춰 곡괭이의 순서를 조정할 수 있습니다. 그래서 정렬로 순서를 바꿔서 value가 가장 큰 순서로 좋은 곡괭이를 사용해 문제를 해결합니다. 추가하자면 정렬할 때, 곡괭이의 개수를 세 실제로 캘 수 있는 광물의 범위를 계산한 뒤 정렬을 해야 합니다. 철 광물 5개 이후 다이아 광물이 나오지 않는다는 의미는 value를 기준으로 정렬을 했을 경우에 나오지 않는다는 의미입니다. 궁금한 점이 있으면 더 물어보세요!
코딩줍줍님 덕분에 이해했습니다 다른사람들 풀이를 제가 더 정확하게 해석했어야했는데 그렇지않았나봐요 죄송합니다 다시 돌이켜보니 해선 안될질문이었네요ㅜㅜ 수준낮은 질문에 세심한 답변 달아주셔서 정말 감사합니다 좋은하루되세요 !!
[철, 철, 철, 철, 철, 다이아] 이렇게 있을 때, 설명하신 대로 계산하면 철의 가치는 100이고 다이아의 가치는 400이 되는데 다이아 곡괭이로 철을 우선적으로 캐야만 최적이 됩니다.
원래 그리디 알고리즘이 현재 상태에서 최선의 선택을 한다는 것에서 착안한 알고리즘인것으로 그리디알고리즘의 선택이 모든것을 고려했을때 최선의 선택인지는 포함되어있지않습니다.
즉, 그리디 알고리즘은 최적의 해를 구하는 알고리즘이 아닙니다..
그럼 해당 문제는 그리디알고리즘을 사용해서 풀면 안되는거 아닌가요 ?
이 문제에서는 그리디 알고리즘이 최적해를 구하는 것과 동일해서 사용해도 됩니다
최적해를 풀어야 할 때 그리디 알고리즘을 적용하는것은 '그리디로 풀었을때 최적해인가' 를 먼저 확인한 후 그리디를 적용해서 풀이합니다
그리디 알고리즘은 단시간에 적당히 좋은 해를 구하기 위해 사용하긴합니다
hyk님 덕분에 그리디 알고리즘에 대해 다시한번 생각해보게되었습니다 감사합니다 좋은하루되세요 !!