[백준] 25381번 ABBC (C++)

2025. 8. 27. 17:44·Algorithm
728x90

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

 

 

이 문제는 ABC로 구성된 문자열이 주어졌을때

 

2가지의 행동을 적절히 사용하여 최대의 행동을 몇 번 할 수있는지 구하는 문제이다.

 

1. A와 그 뒤에있는 B를 지운다.

2. B와 그 뒤에 있는 C를 지운다.

 

글로만 보면 어떻게 최대로 지우는지 잘 모르겠지만

 

아래 테스트 케이스 2개를 보면 어떤거 부터 먼저 지우는지 대충 감이 잡힌다.

 

 

테스트 케이스 1번 ABCBA를 보면 

앞에서부터 AB 또는 BC를 지우면 최대 1번밖에 지울 수 없다.

 

하지만 BC를 먼저 지우고 AB를 지우면 최대 2번을 지울 수 있다.

 

따라서 B와 짝이되는 C를 먼저 지운후 이후에 A를 지우는 것이 최대한 많이 지울 수 있다고 생각하였다.

 

이를 구현하기 위해선 deque를 사용하여 B의 인덱스를 저장하였고

 

앞에서부터 B와 짝이되는 C를 찾아서 앞에서 빼주었고

 

이후에 뒤에서부터 B와 짝이되는 A를 찾아서 뒤에서 빼주며 개수를 늘려주었다.

 

데크를 사용하여 O(1)로 삽입 삭제연산을 할 수 있기 때문에

시간복잡도는 O(N)이며 N은 최대 30만이기 때문에 충분히 1초안에 통과할 수 있다.

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    int y;
    int r;
};

int dx[] = {0, -1, 0, 1, 1, -1, -1, 1};
int dy[] = {-1, 0, 1, 0, -1, 1, -1, 1};
string s;

void solve() {
    int cnt = 0;
    deque<int> dq;

    for(int i = 0; i < s.size(); i++) {
        if(s[i] == 'B') {
            dq.push_back(i);
        }
    }

    for(int i = 0; i < s.size(); i++) {        // C 제거
        if(s[i] == 'C') {
            if(dq.size() != 0 && dq.front() < i) {
                dq.pop_front();
                cnt++;
            }
        }
    }

    for(int i = s.size()-1; i >= 0; i--) {
        if(s[i] == 'A') {
            if(dq.size() != 0 && dq.back() > i) {
                dq.pop_back();
                cnt++;
            }
        }
    }

    cout << cnt;
}

void input() {
    cin >> s;
}

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

    input();
    solve();
}

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 13265번 색칠하기 (C++)  (0) 2025.08.29
[백준] 14620번 꽃길 (C++)  (0) 2025.08.28
[백준] 1068번 트리 (C++)  (0) 2025.08.26
[백준] 2234번 성곽 (C++)  (0) 2025.08.25
[백준] 최소공통조상 LCA 11437번 (C++)  (0) 2025.08.24
'Algorithm' 카테고리의 다른 글
  • [백준] 13265번 색칠하기 (C++)
  • [백준] 14620번 꽃길 (C++)
  • [백준] 1068번 트리 (C++)
  • [백준] 2234번 성곽 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (285) N
      • Programming (52) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (8) N
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (2) N
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    다이나믹 프로그래밍
    그리디
    브루트포스
    백트래킹
    DP
    이분탐색
    Bandit
    코딩
    재귀
    wargame
    c언어
    Leviathan
    투포인터
    시뮬레이션
    linux
    백준
    구현
    다익스트라
    우선순위 큐
    BFS
    정렬
    그래프 이론
    누적합
    깊이우선탐색
    우선순위큐
    WebSecurity
    비트마스킹
    에라토스테네스의 체
    DFS
    트리
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 25381번 ABBC (C++)
상단으로

티스토리툴바