[백준 2851] 슈퍼 마리오 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
버섯을 순서대로 먹으면서 점수를 누적할 때, 총합이 100에 가장 가깝도록 멈추는 시점을 결정하는 문제입니다.
총 10개
의 버섯이 주어지고, 각 버섯에는 100 이하의 점수
가 부여되어 있습니다.
버섯은 반드시 첫 번째부터 차례대로 먹어야 하며,
도중에 멈추면 그 이후의 버섯은 더 이상 먹을 수 없습니다.
목표는 누적 점수가 100
에 최대한 가까워지도록 하되,
가까운 수가 둘일 경우 더 큰 점수를 선택해야 합니다.
접근법
입력으로 주어진 10개
의 점수를 앞에서부터 하나씩 더해가며 누적합을 계산합니다.
- 누적합이
100
이상이 되는 순간 반복을 종료합니다. - 단, 마지막에 더한 값이 오히려
100
을 넘겨버린 경우를 고려해야 합니다.- 이때 이전 누적합과 비교하여 더 가까운 쪽을 선택합니다.
- 두 값이 같은 거리만큼 떨어져 있다면, 더 큰 값을 선택하는 조건에 따라 지금까지의 누적합을 유지합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
class Program {
static void Main() {
int[] mush = new int[10];
for (int i = 0; i < 10; i++)
mush[i] = int.Parse(Console.ReadLine());
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += mush[i];
if (sum >= 100) {
if (sum - 100 > 100 - (sum - mush[i]))
sum -= mush[i];
break;
}
}
Console.WriteLine(sum);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
vi mush(10);
for (int& x : mush)
cin >> x;
int sum = 0;
for (int i = 0; i < 10; ++i) {
sum += mush[i];
if (sum >= 100) {
if (sum - 100 > 100 - (sum - mush[i])) sum -= mush[i];
break;
}
}
cout << sum << "\n";
return 0;
}