정화 코딩

[C++] 과일 탕후루 (백준 30804번) 본문

PS

[C++] 과일 탕후루 (백준 30804번)

jungh150c 2024. 8. 7. 01:48

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

 

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

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

    int n;
    cin >> n;

    vector<int> a(n);
    for (int i = 0; i < n; i++) cin >> a[i];

    int si = 0;
    int ei = 0;
    int maxcnt = 0;
    int cnt = 0;
    set<int> chk;

    while (chk.size() < 2 && ei < n) {
        chk.insert(a[ei]);
        cnt++;
        ei++;
    }
    maxcnt = cnt;

    if (chk.size() < 2) {
        cout << maxcnt << '\n';
        return 0;
    }

    while (ei < n) {
        while (chk.size() < 3 && ei < n) {
            chk.insert(a[ei]);
            ei++;
            cnt++;
            if (chk.size() == 2) {
                if (cnt > maxcnt) maxcnt = cnt;
            }
        }
        while (chk.size() > 2) {
            bool exist = false;
            for (int i = si + 1; i < ei; i++) {
                if (a[i] == a[si]) {
                    exist = true;
                    break;
                }
            }
            if (!exist) {
                chk.erase(a[si]);
            }
            si++;
            cnt--;
        }
        if (cnt > maxcnt) maxcnt = cnt;
    }

    cout << maxcnt << '\n';
}

처음에는 while (chk.size() > 2) 반복문에서 si + 1부터 ei - 1까지 확인하면서 현재 빼려는 수가 있는지 확인하는 로직을 안 넣어서 틀렸다. (WA) 두번째에는 while (chk.size() < 3 && ei < n) 반복문에서 chk.size() == 2인지 확인하는 로직이 없어서 또 틀렸다. (WA) 그래서 위의 코드가 최종 정답 코드이다. (AC)

 

'PS' 카테고리의 다른 글

[C++] IOIOI (백준 5525번)  (2) 2024.09.03
[C++] DSLR (백준 9019번)  (0) 2024.08.07
[C++] 이중 우선순위 큐 (백준 7662번)  (0) 2024.08.06
[C++] 팰린드롬 이름 (백준 29768번)  (0) 2024.08.06
[C++] 돌다리 (백준 12761번)  (0) 2024.08.05
Comments