본문 바로가기

알고리즘 · 코딩

[SWEA 1230] 암호문3

SWEA 1230. [S/W 문제해결 기본] 8일차 - 암호문3 

문제 링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14zIwqAHwCFAYD 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


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