๐•ƒ๐•ฆ๐•„๐•š๐•ฃ

ใ€ŒโŒจ๏ธแด„sใ€PS/๋ฐฑ์ค€_์ž๋ฃŒ๊ตฌ์กฐ[DS]

[Baekjoon/๋ฐฑ์ค€][1406][C/C++] ์—๋””ํ„ฐ

by ๋ฃจ๋ฐ€๐•ƒ๐•ฆ๐•„๐•š๐•ฃ2023. 5. 3.
728x90
๋ฐ˜์‘ํ˜•
ใ€Ž๋ชฉ์ฐจใ€
0. ๊ฐœ์š”

1. ๋ฌธ์ œ
2. ํ’€์ด
3. ์ฝ”๋“œ

0. ๊ฐœ์š”

์ž๋ฃŒ๊ตฌ์กฐ, ์Šคํƒ, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋ฌธ์ œ. STL list์™€ ํ•ด๋‹น iterator๋ฅผ ๋‹ค๋ฃฐ ์ค„ ์•Œ๋ฉด ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

1. ๋ฌธ์ œ

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

 

1406๋ฒˆ: ์—๋””ํ„ฐ

์ฒซ์งธ ์ค„์—๋Š” ์ดˆ๊ธฐ์— ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ž์—ด์€ ๊ธธ์ด๊ฐ€ N์ด๊ณ , ์˜์–ด ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ธธ์ด๋Š” 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ž…๋ ฅํ•  ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜

www.acmicpc.net

๋ฌธ์ œ

ํ•œ ์ค„๋กœ ๋œ ๊ฐ„๋‹จํ•œ ์—๋””ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด ํŽธ์ง‘๊ธฐ๋Š” ์˜์–ด ์†Œ๋ฌธ์ž๋งŒ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ์ง‘๊ธฐ๋กœ, ์ตœ๋Œ€ 600,000๊ธ€์ž๊นŒ์ง€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ํŽธ์ง‘๊ธฐ์—๋Š” '์ปค์„œ'๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ, ์ปค์„œ๋Š” ๋ฌธ์žฅ์˜ ๋งจ ์•ž(์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์˜ ์™ผ์ชฝ), ๋ฌธ์žฅ์˜ ๋งจ ๋’ค(๋งˆ์ง€๋ง‰ ๋ฌธ์ž์˜ ์˜ค๋ฅธ์ชฝ), ๋˜๋Š” ๋ฌธ์žฅ ์ค‘๊ฐ„ ์ž„์˜์˜ ๊ณณ(๋ชจ๋“  ์—ฐ์†๋œ ๋‘ ๋ฌธ์ž ์‚ฌ์ด)์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ๊ธธ์ด๊ฐ€ L์ธ ๋ฌธ์ž์—ด์ด ํ˜„์žฌ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ์œผ๋ฉด, ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ L+1๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์ด ํŽธ์ง‘๊ธฐ๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

L : ์ปค์„œ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊น€ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ์•ž์ด๋ฉด ๋ฌด์‹œ๋จ)
D : ์ปค์„œ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊น€ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ๋’ค์ด๋ฉด ๋ฌด์‹œ๋จ)
B : ์ปค์„œ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•จ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ์•ž์ด๋ฉด ๋ฌด์‹œ๋จ)
์‚ญ์ œ๋กœ ์ธํ•ด ์ปค์„œ๋Š” ํ•œ ์นธ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์ปค์„œ์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋˜ ๋ฌธ์ž๋Š” ๊ทธ๋Œ€๋กœ์ž„
P $ : $๋ผ๋Š” ๋ฌธ์ž๋ฅผ ์ปค์„œ ์™ผ์ชฝ์— ์ถ”๊ฐ€ํ•จ

์ดˆ๊ธฐ์— ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง€๊ณ , ๊ทธ ์ดํ›„ ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด๊ฐ€ ์ฐจ๋ก€๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ๋ช…๋ น์–ด๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์— ์ปค์„œ๋Š” ๋ฌธ์žฅ์˜ ๋งจ ๋’ค์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

[์ž…๋ ฅ]

์ฒซ์งธ ์ค„์—๋Š” ์ดˆ๊ธฐ์— ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ž์—ด์€ ๊ธธ์ด๊ฐ€ N์ด๊ณ , ์˜์–ด ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ธธ์ด๋Š” 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ž…๋ ฅํ•  ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ M(1 ≤ M ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ์ž…๋ ฅํ•  ๋ช…๋ น์–ด๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋ช…๋ น์–ด๋Š” ์œ„์˜ ๋„ค ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜์˜ ํ˜•ํƒœ๋กœ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

[์ถœ๋ ฅ]

์ฒซ์งธ ์ค„์— ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

[์˜ˆ์ œ ์ž…๋ ฅ 1]

abcd
3
P x
L
P y

[์˜ˆ์ œ ์ถœ๋ ฅ 1]

abcdyx

[์˜ˆ์ œ ์ž…๋ ฅ 2]

abc
9
L
L
L
L
L
P x
L
B
P y

[์˜ˆ์ œ ์ถœ๋ ฅ 2]

yxabc

[์˜ˆ์ œ ์ž…๋ ฅ 3]

dmih
11
B
B
P x
L
B
B
B
P y
D
D
P z

[์˜ˆ์ œ ์ถœ๋ ฅ 3]

yxz
๋ฐ˜์‘ํ˜•

2. ํ’€์ด

[์ปค์„œ์˜ ์œ„์น˜]

abc ๋ผ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ^a^b^c^ ์—์„œ ^๊ฐ€ ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ์ด๋‹ค.

 

[Iterator]

list์˜ iterator๋Š” ++ ์—ฐ์‚ฐ๊ณผ -- ์—ฐ์‚ฐ๋งŒ์„ ์ง€์›ํ•œ๋‹ค.

์ด๋•Œ ์ฃผ์˜ํ•  ์ ์€, li.erase(iter)๋Š” iter๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์›์†Œ๋ฅผ ์‚ญ์ œํ•œ ํ›„, ์‚ญ์ œํ•œ ์›์†Œ์˜ ๋‹ค์Œ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” iterator๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๋”ฐ๋ผ์„œ, li.erase(--it); ๊ฐ€ ์•„๋‹Œ it = li.erase(--it); ๋ฅผ ํ†ตํ•ด it๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์–ด์•ผ๋งŒ ์ฝ”๋“œ๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•œ๋‹ค.

3. ์ฝ”๋“œ

#include <iostream>
#include <string>
#include <list>
using namespace std;

int main(int argc, char* argv[]) {
	/* Faster */
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	/* Init & Input */
	list<char> li;
	list<char>::iterator it = li.end();

	string str; cin >> str;
	for (int i = 0; i < str.size(); i++)
		li.push_back(str[i]);

	/* Command */
	int m; cin >> m;
	for (int i = 0; i < m; i++) {
		/* Input */
		char c; cin >> c;

		switch (c) {
		/* L */
		case 'L': {
			if (it == li.begin()) continue;
			it--;

			break;
		}
		/* D */
		case 'D': {
			if (it == li.end()) continue;
			it++;

			break;
		}
		/* B */
		case 'B': {
			if (it == li.begin()) continue;
			it = li.erase(--it);

			break;
		}
		/* P */
		case 'P': {
			char ch; cin >> ch;
			li.insert(it, ch);

			break;
		}

		}
	}

	/* Output */
	for (auto i : li)
		cout << i;

	/* Return */
	return 0;
}

/*
[์ปค์„œ์˜ ์œ„์น˜] 
abc ๋ผ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ,
^a^b^c^ ์—์„œ ^๊ฐ€ ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ์ด๋‹ค.

li.erase(iter)๋Š” iter๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์›์†Œ๋ฅผ ์‚ญ์ œํ•œ ํ›„,
์‚ญ์ œํ•œ ์›์†Œ์˜ ๋‹ค์Œ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” iterator๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๋”ฐ๋ผ์„œ, li.erase(--it); ๊ฐ€ ์•„๋‹Œ
it = li.erase(--it); ๋ฅผ ํ†ตํ•ด it๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
*/
728x90
๋ฐ˜์‘ํ˜•