728x90
SMALL
백준 문제 풀이: 27497 (알파벳 블록)
문제 링크: https://www.acmicpc.net/problem/27497
문제 설명:
알파벳 블록을 이용해 다음과 같은 작업을 수행합니다:
- 1번 명령: 알파벳
c
를 **오른쪽 끝**에 추가합니다. - 2번 명령: 알파벳
c
를 **왼쪽 끝**에 추가합니다. - 3번 명령: 양 끝의 알파벳 중에서 먼저 들어온 블록을 제거합니다.
주어진 명령어를 처리한 후, 남아 있는 블록들을 출력하고, 블록이 없다면 0
을 출력합니다.
문제 해결 코드
#include <iostream>
#include <deque>
using namespace std;
deque> dq; // 블록을 저장할 덱 (알파벳, 순서)
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n; // 명령어 개수
cin >> n;
int cnt = 0; // 블록 추가 시 순서를 저장하는 변수
for (int i = 0; i < n; i++) {
int x; // 명령 번호
char c; // 알파벳
cin >> x;
if (x == 1) {
cin >> c; // 블록을 오른쪽에 추가
cnt++;
dq.push_back({c, cnt});
}
else if (x == 2) {
cin >> c; // 블록을 왼쪽에 추가
cnt++;
dq.push_front({c, cnt});
}
else {
// 양 끝 중 순서가 빠른 블록 제거
if (!dq.empty()) {
if (dq.front().second < dq.back().second) {
dq.pop_back();
} else {
dq.pop_front();
}
}
}
}
// 결과 출력
if (dq.empty()) {
cout << 0; // 블록이 비어 있으면 0 출력
} else {
while (!dq.empty()) {
cout << dq.front().first; // 덱의 앞에서부터 출력
dq.pop_front();
}
}
return 0;
}
코드 설명
코드의 주요 로직과 사용된 알고리즘 설명:
- 핵심 알고리즘:
- 덱(
deque
)을 사용하여 양 끝에서 블록을 추가하거나 제거합니다. - 각 블록에 순서를 부여하여 3번 명령에서 양 끝의 블록 중 먼저 추가된 블록을 제거합니다.
- 덱(
- 구현 세부사항:
push_back()
: 블록을 오른쪽에 추가.push_front()
: 블록을 왼쪽에 추가.pop_front()
와pop_back()
: 3번 명령에 따라 양 끝 중 먼저 추가된 블록을 제거.- 덱이 비어 있으면
0
을 출력합니다.
- 시간 복잡도 분석:
- 덱의 **양 끝에서의 삽입과 삭제**는 O(1) 시간 복잡도를 가집니다.
- 명령이
n
개 주어질 때, 전체 시간 복잡도는 O(n)입니다.
결과
주어진 명령에 따라 블록을 조작한 후 결과를 출력합니다.
- 블록이 남아 있으면: 남아 있는 블록을 왼쪽에서 오른쪽으로 출력
- 블록이 비어 있으면:
0
출력
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 자료 구조' 카테고리의 다른 글
백준 1620번 [나는야 포켓몬 마스터 이다솜](C++) -yes6686- 티스토리 (0) | 2024.12.24 |
---|---|
백준 14427번 [수열과 쿼리 15](C++) -yes6686- 티스토리 (0) | 2024.08.17 |
백준 25957번 [단어 우월 효과 (캠브릿지 대학의 연구결과)](C++) -yes6686- 티스토리 (0) | 2024.05.10 |
백준 2295번 [세 수의 합](C++) -yes6686- 티스토리 (0) | 2024.05.10 |
백준 23757번 [아이들과 선물 상자](C++) -yes6686- 티스토리 (0) | 2024.05.07 |