[ ๋ฌธ์ ๋งํฌ ]
https://www.acmicpc.net/problem/5397
๐ฉ ์กฐ๊ฑด
- ํค๋ก๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ํค๋ณด๋๋ฅผ ๋๋ฅธ ๋ช ๋ น์ ๋ชจ๋ ๊ธฐ๋กํจ
- ๋ฐฑ์คํ์ด์ค : "-" / ์ปค์์ ๋ฐ๋ก ์์ ๊ธ์๊ฐ ์กด์ฌํ๋ค๋ฉด, ๊ทธ ๊ธ์๋ฅผ ์ง์
ํ์ดํ : "<", ">" / ์ปค์์ ์์น๋ฅผ ์์ง์ผ ์ ์๋ค๋ฉด, ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก 1๋งํผ ์์ง์
๋๋จธ์ง ๋ฌธ์๋ ๋น๋ฐ๋ฒํธ์ ์ผ๋ถ - ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ๋ ฅํด๋ผ
๐ฉ ์ ๊ทผ
ํ์ดํ๋ฅผ ํตํด ์ปค์๋ฅผ ์ด๋ํ๊ณ ๊ทธ ์ง์ ์์ ์ฝ์ /์ญ์ ๊ฐ ์ด๋ค์ ธ์ผ ํจ -> ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํํ์.
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๊ตฌ์กฐ์ฒด๋ก ๊ตฌํํ๊ฑฐ๋, STL list๋ก ๊ตฌํํ ์ ์๋ค.
1) ๊ตฌ์กฐ์ฒด
2) STL list ([์ฐธ๊ณ ] ํฐ์คํ ๋ฆฌ)
- ์ฝ์
- push_front(element) : ๋ฆฌ์คํธ ๋งจ ์์ ์์ ์ถ๊ฐ
- push_back(element) : ๋ฆฌ์คํธ ๋งจ ๋ค์ ์์ ์ถ๊ฐ
- insert(iterator, element) : iterator๊ฐ ๊ฐ๋ฆฌํค๋ ๋ถ๋ถ์ ์์ ์์ ์ถ๊ฐ
- ์ญ์
- pop_front() : ๋ฆฌ์คํธ ๋งจ ์์ ์์ ์ญ์
- pop_back() : ๋ฆฌ์คํธ ๋งจ ๋ค์ ์์ ์ญ์
- erase(iterator) : iterator๊ฐ ๊ฐ๋ฆฌํค๋ ๋ถ๋ถ์ ์์ ์ญ์
- ์กฐํ
- front() : ์ฒซ๋ฒ์งธ ์์ ๋ฐํ
- back() : ๋ง์ง๋ง ์์ ๋ฐํ
- *iterator : iterator๊ฐ ๊ฐ๋ฆฌํค๋ ์์์ ์ ๊ทผ
๐ฉ ์ํ์ฐฉ์ค
์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ํด ๋ ๊ณต๋ถํด์ผ๊ฒ ๋ค..
1. ์ปดํ์ผ ์๋ฌ
for (int j = 0; j < L.length(); j++) {
string next = L[j];
์ ๋ถ๋ถ์์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ์๊ณ , ์ด์ ๋ ์๋์ ๊ฐ๋ค.
- L.length()๋ size_t ํ์
์ ๋ฐํํ๊ณ , ์ด๋ unsigned int์ด๋ฏ๋ก int์ ํฌ๊ธฐ ๋น๊ต๋ฅผ ํ ์ ์๋ค. ๋ฐ๋ผ์ ์์ (int)๋ฅผ ๋ถ์ฌ์ฃผ์ด ์บ์คํธํด์ฃผ๋ฉด ๋๋ค. => ๊ทผ๋ฐ vs๋ก ๋๋ ค๋ณด๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋์ง ์๋๋ค. ๋ฐฑ์ค ์ปดํ์ผ๋ฌ๋ GCC๋ผ ๊ทธ๋ฐ๋ฏํ๋ค.. ๊ทผ๋ฐ ๋ ์ด์ํ ๊ฑด vector.size()๋ size_t ํ์
์ ๋ฐํํ๋๋ฐ ๋๊ฐ์ ์ํฉ์์ ์ด๊ฑด ์๋ฌ๊ฐ ๋์ง ์๋๋ค. ๋ญ์ง?
๊ทธ๋ฆฌ๊ณ L.length()์ L.size()๋ ๋์ผํ๋ค. vector, map ๋ฑ์ ๋ค๋ฅธ ์ปจํ ์ด๋์์ ์ผ๊ด์ฑ์ ์ํด size๊ฐ ์กด์ฌํ๋ฉฐ, string์ ๊ธธ์ด์ ๊ดํด ์๊ฐํ ๋ ์ฌ๋๋ค์ด length๋ฅผ ์ฝ๊ฒ ๋ ์ฌ๋ฆฌ๊ธฐ ๋๋ฌธ์, ์ง๊ด์ฑ์ ์ํด ๋์ผํ ๊ธฐ๋ฅ์ length๊ฐ ์๋ค๊ณ ํ๋ค. - L[j]๋ char ํ์ ์ด๋ฏ๋ก, string ํ์ ์ ํ ๋นํ ์ ์๋ค. ๋ฐ๋ผ์ string(1,L[j])๋ก ์์ ํ์ฌ char ํ์ ์ธ L[j]๋ฅผ ๊ธธ์ด๊ฐ 1์ธ ๋ฌธ์์ด๋ก ๋ฐํํ์ฌ next์ ํ ๋นํ์๋ค.
2. ๋ฐํ์ ์๋ฌ (Segfault)
์ ๋ ฅ์ผ๋ก "-"๋ฅผ ๋ฐ๊ฑฐ๋ ๋ค๋ฅธ ๋ฌธ์๋ฅผ ๋ฐ์ ๋, list์ erase, insert ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์๋๋ฐ ์ด ๋ถ๋ถ์์ iterator์ ๊ฑด๋๋ฆฌ๋ ๊ฒ ์ด๋ ค์ ๋ค.
else if (next == "-") {
if (iter != sl.begin())
sl.erase(--iter);
}
else {
sl.insert(iter, next);
}
์ฒ์์๋ ์์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ์ฌ๊ธฐ์ ๋ฌธ์ ๋ erase์ ์๋ค. erase๋ ์ญ์ ๋ ์์ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ iterator์ ๋ฐํํ๋๋ฐ, ์ด๋ฅผ iter๋ก ๋ฐ์์ฃผ์ง ์์ผ๋ฉด iter์ ์ ํจํ์ง ์์ ์์น๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๐ป ์ฝ๋ (C++)
#include <iostream>
#include <list>
#include <string>
using namespace std;
list<string> sl;
list<string>::iterator iter = sl.begin();
int main() {
int x;
string L;
cin >> x;
for (int i = 0; i < x; i++) {
cin >> L;
for (int j = 0; j < (int)L.size(); j++) {
string next = string(1, L[j]);
if (next == "<") {
if (iter != sl.begin())
iter--;
}
else if (next == ">") {
if (iter != sl.end())
iter++;
}
else if (next == "-") {
if (iter != sl.begin())
iter = sl.erase(--iter);
}
else {
sl.insert(iter, next);
}
}
for (iter = sl.begin(); iter != sl.end(); iter++) {
cout << *iter;
}
cout << "\n";
sl.clear();
iter = sl.begin();
}
}
'๐ป Algorithms > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1181 ๋จ์ด ์ ๋ ฌ - ์ ๋ ฌ (0) | 2024.08.25 |
---|---|
[๋ฐฑ์ค] 10814 ๋์ด์ ์ ๋ ฌ - ์ ๋ ฌ (0) | 2024.08.24 |
[๋ฐฑ์ค] 1260 DFS์ BFS - dfs, bfs (0) | 2024.08.20 |
[๋ฐฑ์ค] 2164 ์นด๋2 - ํ (0) | 2024.08.19 |
[๋ฐฑ์ค] 1992 ์ฟผ๋ํธ๋ฆฌ - ์ฌ๊ทํจ์ (0) | 2024.08.19 |