[백준] 2798번

김지섭·2024년 11월 15일
0

백준

목록 보기
3/26

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

전수조사로 모든 합의 경우를 보는 방식으로 한다.

처은엔 i j h 의 초기식을 0으로 하고 if문을 이용하여 3개의 수가 겹치지 않게 하려고 했으나 계속해서 실패하여 초기값 세팅방식을 바꾼다.
(실패)

#include <bits/stdc++.h>
using namespace std;

vector<int> v;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m;
    cin >> n >> m;
    v.resize(n);
    for (int i = 0; i < n; i++)
    {
        int k;
        cin >> k;
        v.push_back(k);
    }

    int sum;
    int max = 0;
    for (int i = 0; i < n; i++)
    {
        sum = 0;
        if (i > 1)
        {
            for (int j = 0; j < i; j++)
            {
                if(j > 0){
                    for(int h = 0; h < j; h++){
                        sum = 0;
                        sum += v[h];
                        sum += v[j];
                        sum += v[i];
                        cout << sum;
                        if(max < sum && sum <= m)
                            max = sum;
                    }
                }
            }
        }   
    }
    cout << max;

    return 0;
}

위 코드가 오류가 나는 이유는 벡터에 이미 resize로 벡터 크기를 설정했는데, push_back을 하면 불필요하게 공간을 늘리면서 벡터에 추가한다.

위 코드에서 불필요한 중복처리를 제거하고 입력은 어차피 3개 이상 되어있으므로 아래처럼 i j h의 초기값 세팅을 하면된다.
(성공)

#include <bits/stdc++.h>
using namespace std;

vector<int> v;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m;
    cin >> n >> m;
    v.resize(n);
    for (int i = 0; i < n; i++)
    {
        int k;
        cin >> k;
        v[i] = k;
    }

    int sum;
    int max = 0;
    for (int i = 2; i < n; i++)
    {
        sum = 0;
        for (int j = 1; j < i; j++)
        {
            for (int h = 0; h < j; h++)
            {
                sum = 0;
                sum += v[h];
                sum += v[j];
                sum += v[i];
                if (max < sum && sum <= m)
                    max = sum;
            }
        }
    }
    cout << max;

    return 0;
}
profile
백엔드 행 유도 미사일

0개의 댓글