문제 4349 · 바이트 III
관측판의 상쇄 표식
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 1000ms / 테스트 (언어별 보정은 아래 표) | 메모리: 측정하지 않음(브라우저 채점) | 0 | 0 | 0 | 0.00% |
문제
한 천문대는 밤하늘에서 들어오는 신호를 네 종류로 분류한다. 각 종류는 대문자 A, B, C, D 중 하나로 표시한다. 관측 장치는 신호가 도착할 때마다 그 종류를 기록하며, 하룻밤 동안 기록한 신호를 도착 순서대로 이어 붙인 문자열을 만든다. 이 문자열에 등장하는 모든 문자는 하나의 신호를 나타낸다. 연구원은 반복 신호를 정리하기 위해 별도의 관측판을 사용한다. 관측판은 처음에 비어 있으며, 아직 상쇄되지 않은 표식을 왼쪽부터 순서대로 보관한다. 연구원은 입력 문자열의 첫 문자부터 마지막 문자까지 각 신호를 정확히 한 번씩 처리한다. 처리 도중에 다음 신호를 건너뛰거나 이미 처리한 신호를 다시 읽는 일은 없다. 새 신호를 처리할 때 관측판이 비어 있으면 그 신호의 표식을 관측판에 적는다. 관측판이 비어 있지 않으면 새 신호와 관측판의 맨 오른쪽 표식을 비교한다. 두 종류가 다르면 새 표식을 맨 오른쪽에 덧붙인다. 두 종류가 같으면 맨 오른쪽 표식을 지우고, 새 신호의 표식도 적지 않는다. 이때 두 신호가 한 쌍으로 상쇄되었다고 하며 상쇄 횟수를 1만큼 늘린다. 한 신호를 처리하면서 상쇄는 최대 한 번만 일어난다. 상쇄로 인해 이전 표식이 드러나더라도 그 순간에는 추가 작업을 하지 않고 다음 입력 신호를 처리한다. 나중에 도착한 신호가 새로 드러난 맨 오른쪽 표식과 같다면 그때 다시 상쇄될 수 있다. 예를 들어 ABBA를 순서대로 처리하면 가운데의 B 두 개가 먼저 상쇄되고, 마지막 A가 남아 있던 A와 상쇄되어 관측판이 비게 된다. 모든 신호를 처리했을 때 발생한 상쇄 횟수와 관측판에 남은 표식의 문자열을 구한다. 남은 표식은 관측판의 왼쪽부터 오른쪽까지 읽는다. 관측판이 비었다면 남은 문자열 대신 정해진 단어 EMPTY를 기록한다.
입력
첫째 줄에 신호 수를 나타내는 정수 N이 주어진다. 1 ≤ N ≤ 100,000이다. 둘째 줄에 길이가 정확히 N인 문자열이 주어진다. 문자열의 각 문자는 대문자 A, B, C, D 중 하나이며 공백은 없다.
출력
첫째 줄에 전체 상쇄 횟수를 정수로 출력한다. 상쇄가 한 번도 일어나지 않았으면 0을 출력한다. 둘째 줄에 관측판에 남은 문자열을 출력한다. 관측판이 비어 있으면 대문자로 EMPTY를 출력한다.
예제 입력 1
8 ABBACDDC
예제 출력 1
4 EMPTY
예제 입력 2
9 AABCCBDDA
예제 출력 2
4 A
예제 입력 3
5 ABCDA
예제 출력 3
0 ABCDA
힌트 펼치기
- 가장 최근에 남긴 표식을 빠르게 확인하고 제거할 수 있는 자료구조를 사용한다.
관련 서재 장
알고리즘 분류
스택문자열풀이 작성
연습 채점은 공개 테스트로 실행합니다. 인증 제출은 코드를 봉인한 뒤 새 입력을 실행하고 서버에서 출력을 대조하며 코드와 판정을 저장합니다.
풀이를 제출하면 여기에서 결과를 확인할 수 있습니다.
연습 기록은 이 브라우저에 최근 50개를 저장합니다. 인증 기록은 내 제출에서 확인하세요.
이 브라우저의 연습 기록
언어별 제한
테스트 케이스마다 새 전역에서 실행하며 준비 시간은 제외합니다. 시간 초과된 출력은 검사하지 않습니다. 브라우저·기기 성능에 따라 실행 시간이 달라집니다.
| 언어 | 엔진(버전) | 시간 제한 | 메모리 |
|---|---|---|---|
| javascript | 사용자 브라우저 JavaScript 엔진 (버전은 브라우저에 따라 다름) | 1000ms / 테스트 | 측정하지 않음(브라우저 채점) |
| python | Pyodide 314.0.7 (CPython 3.14 WASM) | 5000ms / 테스트 | 측정하지 않음(브라우저 채점) |