푼 지 시간이 좀 지나서 보니까 새로 알게됐던 점이나 중요한 부분들이 기억이 안 납니다..
이래서 오답노트와 기록이 정말 중요한가봅니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.ListIterator;
public class P1406 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int n = Integer.parseInt(br.readLine());
LinkedList<Character> list = new LinkedList();
for (int i = 0; i < str.length(); i++) {list.add(str.charAt(i));}
ListIterator<Character> iter = list.listIterator();
while(iter.hasNext()) {iter.next();}
for(int i=0;i<n;i++) {
String[] command = br.readLine().split(" ");
if (command[0].equals("P")) {
char inChar = command[1].charAt(0);
iter.add(inChar);
}
if (command[0].equals("L")) {
if (iter.hasPrevious() == false) {continue;}
iter.previous();
}
if (command[0].equals("D")) {
if (iter.hasNext()==false) {continue;}
iter.next();
}
if(command[0].equals("B")) {
if (iter.hasPrevious() == false) {continue;}
iter.previous(); iter.remove();
}
}
StringBuilder sb = new StringBuilder();
for(char c : list) {
sb.append(c);
}
System.out.println(sb);
}
}
- Errors
#CocurrentModificationException
Collection에 데이터수정메소드 (remove, add, ...)를 호출할 때마다 멤버변수 modCount 값이 증가하는 방식으로 기록함 → next()로 다음 요소를 순환할 때 expectedModCount와 값을 비교하여 값이 같지 않을 경우 발생함
: 멀티쓰레드 환경에서 객체의 변경을 확인하고 막기 위함해결방식
- ListIterator 사용
: List에 직접 add, remove를 사용하지 말고, ListIterator에 modify 메소드를 사용하자
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.ListIterator;
public class P5397 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] inStr = new String[n];
LinkedList<Character> list = new LinkedList<>();
for(int i=0;i<n;i++) {
inStr[i] = br.readLine();
ListIterator iter = list.listIterator();
for(int j=0;j<inStr[i].length();j++) {
char c = inStr[i].charAt(j);
switch(c) {
case '>' :
if(iter.hasNext()) {iter.next();}
break;
case '<' :
if(iter.hasPrevious()) {iter.previous();}
break;
case '-' :
if(iter.hasPrevious()) {iter.previous(); iter.remove();}
break;
default:
iter.add(c);
}
}
StringBuilder sb = new StringBuilder();
for(char c : list) {sb.append(c);}
inStr[i] = sb.toString();
list.clear();
}
for(String s : inStr) {
System.out.println(s);
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.ListIterator;
public class P1158 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] inStr = br.readLine().split(" ");
int n = Integer.parseInt(inStr[0]); int k = Integer.parseInt(inStr[1]);
int[] result = new int[n];
LinkedList<Integer> list = new LinkedList<>();
for(int i=0;i<n;i++) {
list.add(i+1);
}
ListIterator<Integer> iter = list.listIterator();
for(int i=0;i<n;i++) {
for(int j=0;j<k;j++) {
if(j==(k-1) && iter.hasNext()) {result[i]=iter.next(); break;}
else if(j==(k-1) && !iter.hasNext()) {iter=list.listIterator(); result[i]=iter.next(); break;}
if(iter.hasNext()) {iter.next();}
else {iter=list.listIterator(); iter.next();}
}
iter.remove();
}
System.out.print("<");
for(int i=0;i<n;i++) {
System.out.print(result[i]);
if(i!=(n-1)) {System.out.print(", ");}
}
System.out.print(">");
}
}
풀이방식 : LinkedList - ListIterator로 주어진 횟수만큼 next()로 탐색, remove()로 삭제하는 방식
Queue로도 구현이 가능함, 비슷한 문제의 queue 풀이는 queue챕터에 올릴 예정