2022. 11. 21. 08:31, 코딩 테스트/백준(BOJ)
https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
#include<iostream>
#include<algorithm>
using namespace std;
const int MX = 600001;
int pre[MX], nxt[MX];
char dat[MX];
int unused = 1;
void insert(int addr, int num) {
dat[unused] = num;
pre[unused] = addr;
nxt[unused] = nxt[addr];
if (nxt[addr] != -1) pre[nxt[addr]] = unused;
nxt[addr] = unused;
unused++;
}
void erase(int addr) {
nxt[pre[addr]] = nxt[addr];
if (nxt[addr] != -1) pre[nxt[addr]] = pre[addr];
}
void traversal()
{
int cur = nxt[0];
while (cur != -1) {
cout << dat[cur];
cur = nxt[cur];
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
fill(pre, pre + MX, -1);
fill(nxt, nxt + MX, -1);
int cursor = 0; //현재 가리키고 있는 번지
string s;
cin >> s;
for (auto c : s)
{
insert(cursor, c);
cursor++;
}
int num;
cin >> num;
for (int i = 0; i < num; i++)
{
char a;
cin >> a;
if (a == 'P')
{
char add;
cin >> add;
insert(cursor, add);
cursor = nxt[cursor];
}
else if (a == 'L' && pre[cursor] != -1)
cursor = pre[cursor];
else if (a == 'D' && nxt[cursor]!=-1)
cursor = nxt[cursor];
else if (a == 'B' && pre[cursor] != -1)
{
erase(cursor);
cursor = pre[cursor];
}
}
traversal();
}
처음 나혼자 풀 때는 예제 3번을 통과 못 함.
=> cursor를 배열 인덱스처럼 ++,-- 로만 계산해서 메모리 상 남아있는 삭제된 번지로 커서가 이동하고 해서 안된거 같음
수정 후 1) 커서 확인하는 출력문을 안지워서 출력 초과 뜸
수정 후 2) 런타임 에러 (OutOfBounds) 발생
=> 이유를 모르겠어서 if 조건문을 정답 코드로 다 바꿔봄
수정 수정 수정 후) 정답
MX의 크기가 문제에서 필요한 배열 크기보다 작아서 그런거였음
'코딩 테스트 > 백준(BOJ)' 카테고리의 다른 글
| [스택 | 기본문제] 10773번 : 제로 (0) | 2022.11.21 |
|---|---|
| [스택 | 연습문제] 10828번 : 스택 (0) | 2022.11.21 |
| [연결리스트 | 기본문제] 1158번 : 요세푸스 문제 (못 품) (1) | 2022.11.21 |
| [배열 | 기본문제] 3273번 : 두 수의 합 (1) | 2022.11.19 |
| [배열 | 기본문제] 1475번 : 방 번호 (0) | 2022.11.18 |
Comments