SWEA 1230. [S/W 문제해결 기본] 8일차 - 암호문3
문제 링크
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14zIwqAHwCFAYD
C++ 풀이
#include <iostream>
using namespace std;
#define MAX 999999
// Double Linked List
struct ListNode {
int data;
ListNode* prev;
ListNode* next;
ListNode* myAlloc(int _data, ListNode* _prev, ListNode* _next) {
data = _data;
prev = _prev;
next = _next;
_next->prev = this;
return this;
}
} LinkedList[MAX];
ListNode head, tail; //리스트의 head, tail
int bufferCount;
// 초기화
void init() {
bufferCount = 0;
head.next = &tail;
}
// 해당 index번 째 node를 찾아서 리턴
ListNode* getNode(int _index) {
ListNode* ptr = &head;
for (int i = 1; i <= _index; ++i) {
ptr = ptr->next;
if (ptr == &tail)
break;
}
return ptr;
}
// currentPtr 뒤에 node 삽입
ListNode* InsertNode(ListNode* currentPtr, int _data) {
ListNode* temp = currentPtr->next;
currentPtr->next = LinkedList[bufferCount++].myAlloc(_data, currentPtr, temp);
return currentPtr->next;
}
// currentPtr 뒤부터 N개의 노드 삭제
void DeleteNode(ListNode* currentPtr, int N) {
ListNode* ptr = currentPtr;
for (int i = 0; i < N; ++i) {
if (ptr->next != &tail)
ptr = ptr->next;
}
currentPtr->next = ptr->next;
ptr->next->prev = currentPtr;
}
// 리스트 맨 뒤에 노드 삽입
void AddNode(int N) {
ListNode* node = LinkedList[bufferCount++].myAlloc(N, tail.prev, &tail);
tail.prev->next = node;
tail.prev = node;
}
int main() {
int num, input;
char c;
for (int T = 1; T <= 10; ++T) {
ListNode* ptr = &head;
init();
cin >> num;
for (int i = 1; i <= num; ++i) {
cin >> input;
// 노드 생성 후 연결
ptr->next = LinkedList[bufferCount++].myAlloc(input, ptr, ptr->next);
ptr = ptr->next;
}
cin >> num;
for (int i = 1; i <= num; ++i) {
cin >> c;
if (c == 'I') {
int pos, n, m;
cin >> pos;
ptr = getNode(pos);
cin >> n;
for (int j = 0; j < n; ++j) {
cin >> m;
ptr = InsertNode(ptr, m);
}
}
else if (c == 'D') {
int pos, n;
cin >> pos >> n;
ptr = getNode(pos);
DeleteNode(ptr, n);
}
else if (c == 'A') {
int n, t;
cin >> n;
for (int j = 0; j < n; ++j) {
cin >> t;
AddNode(t);
}
}
}
ptr = head.next;
cout << "#" << T;
for (int i = 0; i < 10; ++i) {
cout << " " << ptr->data;
ptr = ptr->next;
}
cout << "\n";
}
return 0;
}
Double Linked List를 구현하여 문제를 풀어보았다.
TC가 여러 개이므로 변수랑 포인터 초기화를 유의해야한다.
반응형
'알고리즘 · 코딩' 카테고리의 다른 글
[백준 5620번] 가장 가까운 두 점의 거리 (0) | 2021.11.06 |
---|---|
[SWEA 1249] 보급로 (0) | 2021.10.27 |
[SWEA 1215] 회문1 (0) | 2021.10.21 |
[SWEA 1221] GNS (0) | 2021.10.21 |
[SWEA 1213] String (0) | 2021.10.20 |