0x04

Jieun·2024년 4월 30일
0

코테

목록 보기
3/18

푼 지 시간이 좀 지나서 보니까 새로 알게됐던 점이나 중요한 부분들이 기억이 안 납니다..
이래서 오답노트와 기록이 정말 중요한가봅니다


* P1406 - 에디터

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 메소드를 사용하자

* P5397 - 키로거

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);
        }
    }
}

* 1158 - 요세푸스

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챕터에 올릴 예정

0개의 댓글