까마쿤의 개발일지 :)
article thumbnail

접근 방식

명령어에 따라 추가/제거 작업이 행해져야 하기 때문에 연결리스트 사용하기로 선택

  • 배열            : O(N)
  • 연결리스트 : O(1)   시간복잡도 유리

제출

코드

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        LinkedList<Character> list = new LinkedList<Character>();
        int cursor = 0;

        for (int i = 0; i < str.length(); i++) {
            list.add(str.charAt(i));
        }
        cursor = list.size();

        int num = sc.nextInt();
        sc.nextLine();
        for (int i = 0; i < num; i++) {
            String mode = sc.nextLine();
            if(mode.charAt(0) == 'P') {
                list.add(cursor, mode.charAt(2));
                cursor++;
            } else if (mode.charAt(0) == 'L') {
                if(cursor != 0)
                    cursor--;
            } else if (mode.charAt(0) == 'D') {
                if(cursor != list.size())
                    cursor++;
            } else if (mode.charAt(0) == 'B') {
                if(cursor != 0) {
                    list.remove(cursor - 1);
                    cursor--;
                }
            } else {
                System.out.println("잘못된 입력입니다.");
                break;
            }
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i));
        }
    }
}

결과

해결 방안

효율적인 입출력을 위해 BufferedReader / BufferedWriter를 사용해 봤다.

코드

import java.io.*;
import java.util.LinkedList;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        LinkedList<Character> list = new LinkedList<Character>();

        int cursor = 0;
        String str = br.readLine();

        for (int i = 0; i < str.length(); i++) {
            list.add(str.charAt(i));
        }
        cursor = list.size();

        int num = Integer.parseInt(br.readLine());
        for (int i = 0; i < num; i++) {
            String mode = br.readLine();
            if(mode.charAt(0) == 'P') {
                list.add(cursor, mode.charAt(2));
                cursor++;
            } else if (mode.charAt(0) == 'L') {
                if(cursor != 0)
                    cursor--;
            } else if (mode.charAt(0) == 'D') {
                if(cursor != list.size())
                    cursor++;
            } else if (mode.charAt(0) == 'B') {
                if(cursor != 0) {
                    list.remove(cursor - 1);
                    cursor--;
                }
            } else {
                bw.write("잘못된 입력입니다.");
                break;
            }
        }
        for (int i = 0; i < list.size(); i++) {
            bw.write(list.get(i));
        }
        bw.flush();
        bw.close();
    }
}

채점 결과

여전히 [시간 초과]가 떴다.

어떻게 해결할까 검색을 하다가 ListIterator 인터페이스를 활용하면 가능하다고 해서 사용해 보았다.

https://mygumi.tistory.com/62
 

ListIterator 인터페이스 활용하기 :: 마이구미

이번 글은 자바에서 활용할 수 있는 ListIterator 인터페이스를 다룰 것이다.처음보거나 사용해본 적이 없다면 굉장히 유용하게 사용할 수 있다. 백준 알고리즘 사이트 1406번 문제 '에디터'를 접근

mygumi.tistory.com

코드

import java.io.*;
import java.util.LinkedList;
import java.util.ListIterator;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        LinkedList<Character> list = new LinkedList<Character>();

        String str = br.readLine();

        for (int i = 0; i < str.length(); i++) {
            list.add(str.charAt(i));
        }
        ListIterator<Character> iter = list.listIterator();
        while (iter.hasNext()) {
            iter.next();
        }
        
        int num = Integer.parseInt(br.readLine());
        
        for (int i = 0; i < num; i++) {
            String mode = br.readLine();
            
            if(mode.charAt(0) == 'P') {
                iter.add(mode.charAt(2));
            } else if (mode.charAt(0) == 'L') {
                if(iter.hasPrevious())
                    iter.previous();
            } else if (mode.charAt(0) == 'D') {
                if(iter.hasNext())
                    iter.next();
            } else if (mode.charAt(0) == 'B') {
                if(iter.hasPrevious()) {
                    iter.previous();
                    iter.remove();
                }
            } else {
                break;
            }
        }
        for(Character chr : list) {
            bw.write(chr);
        }
        bw.flush();
        bw.close();
    }
}

채점 결과

결과

ListIterator의 유무도 시간초과의 한몫을 차지했지만, 여러 번의 실험 끝에 List를 출력하는 코드 또한 시간초과 결과를 얻는데 큰 비중을 차지한 것 같다.

// 결과 : 시간초과 - for문
for (int i = 0; i < list.size(); i++) {
            bw.write(list.get(i));
        }
// 결과 : 통과 - for each 문
for(Character chr : list) {
            bw.write(chr);
        }

 

profile

까마쿤의 개발일지 :)

@개발하는 까마쿤

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!