문제번호: 18185
문제명: 라면 사기 (Small)
문제링크: https://www.acmicpc.net/problem/18185
문제내용과 예제 입/출력은 위 문제 링크에서 확인해 주시기 바랍니다
오늘은 두 번째로 다이아 문제를 풀었습니다. 이번 문제는 라면사기라는 제목으로 라면을 공장에서 사 올 때 최소가격을 구하는 문제입니다. 라면을 사는 경우의 수는 3가지입니다. 라면 3개를 3개의 공장에서 연속으로 사고 7원을 내는 경우, 라면 2개를 2개의 공장에서 연속으로 사고 5원을 내는 경우, 라면 1개를 1개의 공장에서 사고 3원을 내는 경우입니다.
여기서 알 수 있는 사실은 3개 구매 경우를 최대한 활용해야한다는 점입니다. 2개를 사고 1개를 따로 사게 된다면 5 + 3이므로 7을 초과하게 됩니다.
위 사실에 기반하여 한 가지 예외사항을 추가해 주었습니다. 3개를 사는 경우의 수에서 만약 i + 1이(중간값) i + 2(마지막 값) 보다 크다면 2개를 먼저 사도록 했습니다. 이 상황에서 3개를 구매해 버리면 나중에 2개 + 1개를 3개 대신 구매해야 하는 경우가 생기기 때문입니다.
다음은 정답코드입니다.
public static void Main()
{
using StreamReader sr = new StreamReader(Console.OpenStandardInput());
using StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
int N = int.Parse(sr.ReadLine());
List<int> numbers = Array.ConvertAll(sr.ReadLine().Split(), int.Parse).ToList();
int count = 0;
for (int i = 0; i < numbers.Count; i++)
{
while (numbers[i] > 0)
{
if (i + 2 < numbers.Count && numbers[i + 1] > 0 && numbers[i + 2] > 0)
{
if (numbers[i + 1] > numbers[i + 2])
{
numbers[i]--;
numbers[i + 1]--;
count += 5;
}
else
{
numbers[i]--;
numbers[i + 1]--;
numbers[i + 2]--;
count += 7;
}
}
else if (i + 1 < numbers.Count && numbers[i + 1] > 0)
{
numbers[i]--;
numbers[i + 1]--;
count += 5;
}
else
{
numbers[i]--;
count += 3;
}
}
}
sw.WriteLine(count);
}'알고리즘 풀이' 카테고리의 다른 글
| [C#] 백준 1244번 문제풀이 (0) | 2026.03.06 |
|---|---|
| [C#] 백준 1916번 문제풀이 (0) | 2026.03.05 |
| [C#] 백준 11004번 문제풀이 (0) | 2026.03.03 |
| [C#] 백준 27964번 문제풀이 (1) | 2026.03.02 |
| [C#] 백준 4673번 문제풀이 (0) | 2026.03.01 |