๋ฌธ์
ํ ์ค๋ก ๋ ๊ฐ๋จํ ์๋ํฐ๋ฅผ ๊ตฌํํ๋ ค๊ณ ํ๋ค. ์ด ํธ์ง๊ธฐ๋ ์์ด ์๋ฌธ์๋ง์ ๊ธฐ๋กํ ์ ์๋ ํธ์ง๊ธฐ๋ก, ์ต๋ 600,000๊ธ์๊น์ง ์ ๋ ฅํ ์ ์๋ค.
์ด ํธ์ง๊ธฐ์๋ '์ปค์'๋ผ๋ ๊ฒ์ด ์๋๋ฐ, ์ปค์๋ ๋ฌธ์ฅ์ ๋งจ ์(์ฒซ ๋ฒ์งธ ๋ฌธ์์ ์ผ์ชฝ), ๋ฌธ์ฅ์ ๋งจ ๋ค(๋ง์ง๋ง ๋ฌธ์์ ์ค๋ฅธ์ชฝ), ๋๋ ๋ฌธ์ฅ ์ค๊ฐ ์์์ ๊ณณ(๋ชจ๋ ์ฐ์๋ ๋ ๋ฌธ์ ์ฌ์ด)์ ์์นํ ์ ์๋ค. ์ฆ ๊ธธ์ด๊ฐ L์ธ ๋ฌธ์์ด์ด ํ์ฌ ํธ์ง๊ธฐ์ ์ ๋ ฅ๋์ด ์์ผ๋ฉด, ์ปค์๊ฐ ์์นํ ์ ์๋ ๊ณณ์ L+1๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด ํธ์ง๊ธฐ๊ฐ ์ง์ํ๋ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
์๋ ํ์ธ
L | ์ปค์๋ฅผ ์ผ์ชฝ์ผ๋ก ํ ์นธ ์ฎ๊น (์ปค์๊ฐ ๋ฌธ์ฅ์ ๋งจ ์์ด๋ฉด ๋ฌด์๋จ) |
D | ์ปค์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ฎ๊น (์ปค์๊ฐ ๋ฌธ์ฅ์ ๋งจ ๋ค์ด๋ฉด ๋ฌด์๋จ) |
B | ์ปค์ ์ผ์ชฝ์ ์๋ ๋ฌธ์๋ฅผ ์ญ์ ํจ (์ปค์๊ฐ ๋ฌธ์ฅ์ ๋งจ ์์ด๋ฉด ๋ฌด์๋จ) ์ญ์ ๋ก ์ธํด ์ปค์๋ ํ ์นธ ์ผ์ชฝ์ผ๋ก ์ด๋ํ ๊ฒ์ฒ๋ผ ๋ํ๋์ง๋ง, ์ค์ ๋ก ์ปค์์ ์ค๋ฅธ์ชฝ์ ์๋ ๋ฌธ์๋ ๊ทธ๋๋ก์ |
P $ | $๋ผ๋ ๋ฌธ์๋ฅผ ์ปค์ ์ผ์ชฝ์ ์ถ๊ฐํจ |
์ด๊ธฐ์ ํธ์ง๊ธฐ์ ์ ๋ ฅ๋์ด ์๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๊ณ , ๊ทธ ์ดํ ์ ๋ ฅํ ๋ช ๋ น์ด๊ฐ ์ฐจ๋ก๋ก ์ฃผ์ด์ก์ ๋, ๋ชจ๋ ๋ช ๋ น์ด๋ฅผ ์ํํ๊ณ ๋ ํ ํธ์ง๊ธฐ์ ์ ๋ ฅ๋์ด ์๋ ๋ฌธ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ช ๋ น์ด๊ฐ ์ํ๋๊ธฐ ์ ์ ์ปค์๋ ๋ฌธ์ฅ์ ๋งจ ๋ค์ ์์นํ๊ณ ์๋ค๊ณ ํ๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์ด๊ธฐ์ ํธ์ง๊ธฐ์ ์ ๋ ฅ๋์ด ์๋ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ์ด ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ N์ด๊ณ , ์์ด ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๊ธธ์ด๋ 100,000์ ๋์ง ์๋๋ค. ๋์งธ ์ค์๋ ์ ๋ ฅํ ๋ช ๋ น์ด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์ ์ M(1 โค M โค 500,000)์ด ์ฃผ์ด์ง๋ค. ์ ์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฑธ์ณ ์ ๋ ฅํ ๋ช ๋ น์ด๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค. ๋ช ๋ น์ด๋ ์์ ๋ค ๊ฐ์ง ์ค ํ๋์ ํํ๋ก๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ชจ๋ ๋ช ๋ น์ด๋ฅผ ์ํํ๊ณ ๋ ํ ํธ์ง๊ธฐ์ ์ ๋ ฅ๋์ด ์๋ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ค.
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋งํ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
0.3 ์ด (ํ๋จ ์ฐธ๊ณ ) | 512 MB | 108021 | 30050 | 20095 | 26.527% |
https://www.acmicpc.net/problem/1406
ํ์ด
์ฝ๋
1๋ฒ์งธ ์๋
public class ์๋ํฐ {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
List<Character> list = new ArrayList<>();
String str = sc.nextLine(); //์
๋ ฅ 1๋ฒ์ค์ ๋ฐ์์จ๋ค.
int cursor = 1; //์ปค์๋ฅผ ์ ์ธ
for (int i = 0; i < str.length(); i++) {
list.add(str.charAt(i)); //๋ฆฌ์คํธ์ str์ ํ๊ธ์์ฉ ๋ฃ๋๋ค.
}
cursor = list.size() + 1; //์ปค์์ ์์น๋ฅผ ์ก๋๋ค.
int M = sc.nextInt(); //์
๋ ฅํ ๋ช
๋ น์ด์ ๊ฐ์
for (int i = 0; i < M; i++) { //๋ช
๋ น์ด ๊ฐ์๋งํผ ๋ฐ๋ณต
String command = sc.nextLine();
char c = command.charAt(0);
switch (c) {
case 'P':
char ch = command.charAt(2);
list.add(cursor - 1, ch); //์ปค์๋ 1๋ถํฐ ์์ ํ๋๊น 1๋นผ์ค๋ค.
cursor += 1;
break;
case 'L':
if (cursor > 1) {
cursor -= 1;
}
break;
case 'D':
if (cursor < list.size() + 1) {
cursor += 1;
}
break;
case 'B':
if(cursor > 1){
list.remove(cursor-2);
cursor -= 1;
}
break;
}
}
list.forEach(System.out::println);
bw.flush();
bw.close();
}
}
ArrayList๋ก ๊ตฌํํ๊ณ , sout์ผ๋ก ์ถ๋ ฅํ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค. ๊ทธ๋์ ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝํด๋ณด์๋ค.
2๋ฒ์งธ ์๋
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ์๋ํฐ {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
List<Character> list = new ArrayList<>();
String str = br.readLine(); //์
๋ ฅ 1๋ฒ์ค์ ๋ฐ์์จ๋ค.
int cursor = 1; //์ปค์๋ฅผ ์ ์ธ
for (int i = 0; i < str.length(); i++) {
list.add(str.charAt(i)); //๋ฆฌ์คํธ์ str์ ํ๊ธ์์ฉ ๋ฃ๋๋ค.
}
cursor = list.size() + 1; //์ปค์์ ์์น๋ฅผ ์ก๋๋ค.
int M = Integer.parseInt(br.readLine()); //์
๋ ฅํ ๋ช
๋ น์ด์ ๊ฐ์
for (int i = 0; i < M; i++) { //๋ช
๋ น์ด ๊ฐ์๋งํผ ๋ฐ๋ณต
String command = br.readLine();
char c = command.charAt(0);
switch (c) {
case 'P':
char ch = command.charAt(2);
list.add(cursor - 1, ch); //์ปค์๋ 1๋ถํฐ ์์ ํ๋๊น 1๋นผ์ค๋ค.
cursor += 1;
break;
case 'L':
if (cursor > 1) {
cursor -= 1;
}
break;
case 'D':
if (cursor < list.size() + 1) {
cursor += 1;
}
break;
case 'B':
if(cursor > 1){
list.remove(cursor-2);
cursor -= 1;
}
break;
}
}
for(Character chr : list) {
bw.write(chr);
}
bw.flush();
bw.close();
}
}
์ ์ถ๋ ฅ ๋ฐฉ์์ BufferedReader / BufferedWriter๋ก ๋ณ๊ฒฝ -> ์๋ฌ ๋ฐ์
๋ฌธ์ ๋ฅผ ์๊ฐํด๋ณด๋ฉด ArrayList์ ์ฌ์ฉ์ด ๋ฌธ์ ์ธ๊ฒ์ด๋ค. ์ด๋ฌธ์ ๋ ์ฝ์ / ์ญ์ ์ ๋น ๋ฅธ ์ฒ๋ฆฌ๋ฅผ ์๊ตฌํ๊ณ ์์ผ๋ฏ๋ก ArrayList์ ์ฌ์ฉ์ ๋ถ๋ฆฌํ๋ค.
๋ต์ ์ฒ์ ์์ฑํ์ ๋, ์ฝ๋ 1์ฒ๋ผ ์์ฑ์ ํ๋ค. ๋ฌธ์ ์ ๋ ฅ์ ๋ฐ๋ผ index๊ฐ์ ๋ณํ์์ผ ์ปค์๋ฅผ ์์ง์ด๋ ์์ผ๋ก ํ๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ ๊ฒ ํ๊ฒ ๋๋ฉด, ๋ฌธ์๋ฅผ ์ญ์ ํ๊ณ list์์์ ์ฌ๋ฐฐ์ด๋ ๋ O(n)์ด ๋์ค๊ฒ ๋๊ณ , ์ด๊ฒ์ ๋ฐ๋ณตํ๊ฒ ๋๋ฉด O(n^2)๋ก ์ด ๋ช ๋ น์ด๊ฐ 500,000๊ฐ ์ด๋ฏ๋ก 500,000^2๊ฐ ๋์ด ์๊ฐ ์ด๊ณผ๊ฐ ๋์จ๋ค.
๊ทธ๋์ stringbuilder๋ ์ฌ์ฉํ์ง๋ง, ๊ณ์ํด์ ์๊ฐ ์ด๊ณผ๊ฐ ๋์ ํํธ๋ฅผ ์ป๊ธฐ ์ํด ๊ตฌ๊ธ๋ง์ ํ๋ค.
์๊ฐ ์ด๊ณผ๋ฅผ ํผํ๊ธฐ ์ํด์ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ ์ผ์ชฝ ์คํ, ์ค๋ฅธ์ชฝ ์คํ์ ๊ตฌํํ๋ ๊ฒ์ด์๋ค. ์คํ์์์ push, pop์ ์๊ฐ ๋ณต์ก๋๊ฐ O(1)์ด์ด์ n๋ฒ ๋ฐ๋ณตํ๋ฉด O(n)์ด ๋๊ธฐ ๋๋ฌธ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋์ค์ง ์๋๋ค.
์์งํ๊ฒ ํํธ๋ฅผ ๋ณด์ง ์์๋ค๋ฉด ์ด ๋ฌธ์ ๋ ํ ์ ์์์ ๊ฒ ๊ฐ๋ค. ์ผ์ชฝ ์คํ, ์ค๋ฅธ์ชฝ ์คํ์ ๊ตฌ๋ถํ์ฌ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ด ์ ๋ง ๊ธฐ๋ฐํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ , index๊ฐ์ ๋ณํ์์ผ ์ปค์๋ฅผ ์์ง์ด๋ฉด O(n)์ด ์ฌ์ฉ๋๋ค๋ ๊ฒ๋ ์๊ฒ ๋์๋ค.
๊ทธ๋์ ์คํ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์๋๋ฐ๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋์๋ค. ๋ง์ง๋ง์ StringBuilder๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๊ฐ ๋ง์๋ค.
์ด ์ ์ ๋ณด๊ณ , stringbuilder๊ฐ println๋ณด๋ค ๋น ๋ฅธ ์ถ๋ ฅ์ ํ๊ฒ ๋จ์ ์ ์ ์์๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ์ง๋ฌธ๋ค๊ณผ ๋ค๋ฅธ ์ฌ๋๋ค์ ํฌ์คํธ๋ฅผ ์ฐพ์๋ณด์๋ค.
์ฒ์ ๊ตฌํํ ๋ฐฉ๋ฒ์์๋ index ๋ณ์๋ฅผ ์ด์ฉํด ์ปค์์ ์์น๋ฅผ ๋ค๋ฃจ์๊ณ , L/D/B/P ์ LinkedList๊ฐ ์ปค์์ ์์น, ์ฆ ํด๋นํ๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๊ณ ์ฝ์ /์ญ์ ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ด์๋ค.
ํ์ง๋ง ์ด์ฒ๋ผ ์์น๋ฅผ ์ฐพ์๊ฐ์ง ๋ง๊ณ ๋ฌธ์ ์ '์ปค์'์ฒ๋ผ ํด๋นํ๋ ์์น์ ๊ณ์ ์์ผ๋ฉด์ ์ฝ์ /์ญ์ ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ค.
๊ทธ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ListIterator์ ์ฌ์ฉ์ด๋ค!
๊ทธ๋ฆฌ๊ณ LinkedList๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์ด์ ๋ ์๋์ ์ฒจ๋ถํ๋ค
ArrayList์ LinkedList์ ์ฐจ์ด
https://dev-coco.tistory.com/19
3๋ฒ์งธ ์๋
package ๊ธฐ์ด1.Day02.์ ํด์;
import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public class ์๋ํฐ {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
List<Character> list = new LinkedList<>();
String str = br.readLine(); //์
๋ ฅ 1๋ฒ์ค์ ๋ฐ์์จ๋ค.
for (int i = 0; i < str.length(); i++) {
list.add(str.charAt(i)); //๋ฆฌ์คํธ์ str์ ํ๊ธ์์ฉ ๋ฃ๋๋ค.
}
int M = Integer.parseInt(br.readLine()); //์
๋ ฅํ ๋ช
๋ น์ด์ ๊ฐ์
//iterator๋ฉ์๋ ํธ์ถ.
ListIterator<Character> iterator = list.listIterator();
//์ฒ์์ ์ปค์๊ฐ ๋ฌธ์ฅ์ ๋งจ๋ค์ ์์ด์ผ ํ๋ฏ๋ก ์ปค์๋ฅผ ๋งจ๋ค๋ก ์ด๋์ํจ๋ค.
while (iterator.hasNext()){
iterator.next();
}
for (int i = 0; i < M; i++) { //๋ช
๋ น์ด ๊ฐ์๋งํผ ๋ฐ๋ณต
String command = br.readLine();
char c = command.charAt(0);
switch (c) {
case 'P':
char ch = command.charAt(2);
iterator.add(ch);
break;
case 'L':
if (iterator.hasPrevious()) {
iterator.previous();
}
break;
case 'D':
if (iterator.hasNext()) {
iterator.next();
}
break;
case 'B':
if(iterator.hasPrevious()){
iterator.previous();
iterator.remove();
}
break;
}
}
for(Character chr : list) {
bw.write(chr);
}
bw.flush();
bw.close();
}
}
์ฑ๊ณต...!
https://minhamina.tistory.com/17
https://hianna.tistory.com/620 ๋ฆฌ์คํธ ์ค๊ฐ์ ๊ฐ์ถ๊ฐ
https://st-lab.tistory.com/92?category=830901 ์๋ฐ ์ค์บ๋ ํด๋์ค https://h-apple11.tistory.com/32
https://st-lab.tistory.com/41 ์๋ฐ์
๋ ฅ ๋ฏ์ด๋ณด๊ธฐ