BOJ1406 에디터

문제

문제출저


풀이코드

  • 처음엔 LinkedList와 int형 cursor변수를 가지고 풀었는데, 시간초과가 떴다.
  • cursor을 가지고 매번 LinkedList에 접근하는것도 cursor만큼의 연산을 수행한다는게 문제였는데, 연산을 계속 하더라도 계속해서 커서의 위치를 가져가는게 관건이었다. 구글링의 힘을 빌려 ListIterator라는 것을 알게 되서 이것을 이용해서 문제를 해결할 수 있었다.
class Editor {
	public static final String MOVE_LEFT = "L";
	public static final String MOVE_RIGHT = "D";
	public static final String DELETE = "B";
	public static final String ADD = "P";

	private List<Character> charList;
	private ListIterator<Character> listIteartor;

	public Editor(String input) {
		this.charList = new LinkedList<>();
		listIteartor = charList.listIterator(charList.size());
		
		for (int i = 0; i < input.length(); i++) {
			listIteartor.add(input.charAt(i));
		}

	}

	public void executeCmd(String[] cmd) {
		switch (cmd[0]) {
		case MOVE_LEFT:
			if (listIteartor.hasPrevious()) {
				listIteartor.previous();
			}
			return;
		case MOVE_RIGHT:
			if (listIteartor.hasNext()) {
				listIteartor.next();
			}
			return;
		case DELETE:
			if (listIteartor.hasPrevious()) {
				listIteartor.previous();
				listIteartor.remove();
			}
			return;
		case ADD:
			listIteartor.add(cmd[1].charAt(0));
			return;
		}

	}

	public String getStr() {
		StringBuffer str = new StringBuffer();
		for (char ch : charList) {
			str.append(ch);
		}
		return str.toString();
	}
}

배운점

  • ListIterator에 대해서 알게 되었다.
  • 다른사람들의 풀이를 보니 Stack 2개를 이용해서 푸는사람도 있었고, Node클래스를 따로 만들어서 Node배열을 가지고 푼사람도 있었는데 이경우 실행속도가 훨씬빨랐다! 다른 방법을 시도해서 문제를 풀어봐야겠다.