티스토리 뷰

 

문제 : https://www.acmicpc.net/problem/1406

 

https://blog.encrypted.gg/932?category=773649  님의 강의를 보고 문제를 풀어봤습니다. 물론 제 개인적으로 만든 연결리스트 코드도 있습니다.

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

 

[실전 알고리즘] 0x04강 - 연결 리스트

안녕하세요, 바킹독이에요. 배열은 복습 잘 하셨나요? 이번 시간에는 연결 리스트라는 것을 같이 배워보겠습니다. 배열에서 한 것 처럼 연결 리스트가 무엇인지 알아보고, 같이 구현해볼 것입니

blog.encrypted.gg

 

강의를 보고 쓴 코드

더보기
#pragma warning(disable:4996)
#include<iostream>
#include<string>

using namespace std;
#define MX 1000005

char dx[MX];
int pre[MX];
int nxt[MX];
int unused = 1;
void Insert(int cursur, char c) {
	dx[unused] = c;
	pre[unused] = cursur;
	nxt[unused] = nxt[cursur];
	if (nxt[cursur] != -1) pre[nxt[cursur]] = unused;
	nxt[cursur] = unused;
	unused++;
}

void Delete(int cursur) {
	nxt[pre[cursur]] = nxt[cursur];
	if (nxt[cursur] != -1) pre[nxt[cursur]] = pre[cursur];
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	string s;
	int cursur = 0;
	fill(pre, pre + MX, -1);
	fill(nxt, nxt + MX, -1);
	cin >> s;
	for (auto a : s) {
		Insert(cursur, a);
		cursur++;
	}
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		char op;
		cin >> op;
		switch (op) {
		case 'L':
			if (pre[cursur] != -1) cursur = pre[cursur];
			break;
		case 'D':
			if (nxt[cursur] != -1) cursur = nxt[cursur];
			break;
		case 'B':
			if (pre[cursur] != -1) {
				Delete(cursur);
				cursur = pre[cursur];
			}
			break;
		case 'P':
			char str;
			cin >> str;
			Insert(cursur, str);
			cursur = nxt[cursur];
			break;
		}
	}
	int i = 0;
	while (nxt[i] != -1) {
		printf("%c", dx[nxt[i]]);
		i = nxt[i];
	}
}

 

제가 직접 만든 코드( 백준에서 에러가 나긴 하는데 뭐가 문제인지는 잘 모르겠습니다.. 아시는 분 있으시면 댓글 부탁드리겠습니다. )

더보기
#include<iostream>
#include<string>

using namespace std;
typedef struct Node {
	Node(char c) : c(c) {}
	char c;
	Node* Next = nullptr;
	Node* Prev = nullptr;
};

Node* Head = nullptr;

void MoveLeft(Node* Cursur) {
	if (Cursur->Prev != nullptr) {
		Cursur->Next = Cursur->Prev;
		Cursur->Prev = Cursur->Prev->Prev;
	}
}

void MoveRight(Node* Cursur) {
	if (Cursur->Next != nullptr) {
		Cursur->Prev = Cursur->Next;
		Cursur->Next = Cursur->Next->Next;
	}
}

void Insert(Node* Cursur, char c) {
	Node* tmp = new Node(c);
	tmp->Next = Cursur->Next;
	tmp->Prev = Cursur->Prev;
	if (Cursur->Next != nullptr)
		Cursur->Next->Prev = tmp;
	if (Cursur->Prev != nullptr)
		Cursur->Prev->Next = tmp;
	Cursur->Prev = tmp;
	if (tmp->Prev == nullptr)
		Head = tmp;
}

void Delete(Node* Cursur) {
	Node* tmp = Cursur->Prev;
	if (tmp != nullptr) {
		if (tmp->Prev != nullptr)
			tmp->Prev->Next = Cursur->Next;
		if (tmp->Next != nullptr)
			tmp->Next->Prev = Cursur->Prev->Prev;
		Cursur->Prev = Cursur->Prev->Prev;
		//delete tmp;
	}
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	string s;
	Node* Cursur = new Node(0);		
	cin >> s;
	for (auto a : s) {
		Node* tmp = new Node(a);
		tmp->Next = Cursur;
		tmp->Prev = Cursur->Prev;
		if (Head == nullptr) {
			Head = tmp;
		}
		else {
			Cursur->Prev->Next = tmp;
		}
		Cursur->Prev = tmp;
	}
	Cursur->Prev->Next = nullptr;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		char op;
		cin >> op;
		switch (op) {
		case 'L':
			MoveLeft(Cursur);
			break;
		case 'D':
			MoveRight(Cursur);
			break;
		case 'B':
			Delete(Cursur);
			break;
		case 'P':
			char str;
			cin >> str;
			Insert(Cursur, str);
			break;
		}
	}
	if (Cursur->Next == nullptr && Cursur->Prev == nullptr)
		printf("");
	else {
		while (Head != nullptr) {
			printf("%c", Head->c);
			Head = Head->Next;
		}
	}
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함