PS/브루트포스 알고리즘[Bruteforce]

백준 2851 슈퍼 마리오(c++)

SeungbeomKim 2022. 10. 12. 21:50

https://www.acmicpc.net/problem/2851

 

2851번: 슈퍼 마리오

첫째 줄에 마리오가 받는 점수를 출력한다. 만약 100에 가까운 수가 2개라면 (예: 98, 102) 마리오는 큰 값을 선택한다.

www.acmicpc.net

<코드>

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    int score;
    int time = 10;
    int sum = 0;
    vector<int>v;
    while(time--)
    {
        cin>>score;
        v.push_back(score);
    }
    for(int i=0;i<v.size();i++)
    {
        sum += v[i];
        if(sum>=100)
        {
            if(sum - 100 <= 100 - (sum - v[i]))
            {
                cout<<sum<<'\n';
                return 0;
            }
            else
            {
                cout<<sum - v[i]<<'\n';
                return 0;
            }
        }
    }
    cout<<sum<<'\n';
}

<풀이 과정>

쉬운 문제 대비 정답률이 40퍼대로 낮은 편이다.

그 이유는 100에 가장 가까운 수의 합을 구하려고 사람들이 100을 기준으로 삼았기에, 모든 수의 합이 100인 것을 고려하지 않았기 때문이다. 그래서 100을 넘었을 때에 if문을 걸어주고, 바로 return값을 반환한다.

sum == 100을 넘었을 때의 sum 값, sum - v[i] == 100 넘기 직전의 sum값  

sum - 100 >= 100 - (sum - v[i]) 예시는

예를 들어 120과 80의 값이 있고 v[i]가 40이면, 120 - 100 >= 100 - 80 이므로 조건이 참이기 때문에 120을 반환한다.

문제의 조건에서 100에 가까운 수가 두 개이면 큰 값을 반환한다고 설명해놨기 때문이다.

그리고 모든 수의 합이 100보다 작다면 무조건 100보다 가까운 수가 되기에, 그 값을 반환해주면 끝이다.