https://www.acmicpc.net/problem/5397

 

5397번: 키로거

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입

www.acmicpc.net

코드설명

연결리스트 혹은 링크드리스트를 활용하여 해결할 수 있습니다.

 

문제에서 주어진대로 구현하면 되지만, 몇가지 신경써야할점입니다.

1. '<' 혹은 '>' 표시가 있을시 해당 방향으로 이동하기에 해당방향만 null 아닐시에만 이동되도록 처리합니다.

if(str.charAt(j) == '<') {

    if(current.prev != null) {
        current = current.prev;
    }

}
else if(str.charAt(j) == '>') {

    if(current.next != null) {
        current = current.next;
    }

}

 

2. 키보드로 입력한 키는 알파벳 대문자, 소문자, 숫자 일시에

맨앞의 경우, 바로 뒤가 비어있을수 있으니 null을 체크하여 진행합니다.

//맨앞일시
if(current.prev == null) {
    newNode.prev = current;
    newNode.next = current.next;


    if(current.next != null) { //바로 다음 연결리스트가 null인지 확인해야합니다.
        current.next.prev = newNode;	
    }
    current.next = newNode;

    current = newNode;
}

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


public class Main {
	public static int T, N, M;
	public static Node root = new Node(' ', null, null);
	public static Node current;
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	T = Integer.parseInt(st.nextToken());
    	
    	for(int i=0;i<T;i++) {
    		st = new StringTokenizer(br.readLine());
    		root = new Node(' ', null, null);
    		current = root;
    		String str = st.nextToken();
    		for(int j=0;j<str.length();j++) {
    			
    			if(str.charAt(j) == '<') {
    				
    				if(current.prev != null) { //해당방향만 확인합니다.
    					current = current.prev;
    				}
    				
    			}
    			else if(str.charAt(j) == '>') { //해당방향만 확인합니다.
    				
    				if(current.next != null) {
    					current = current.next;
    				}
    				
    			}
    			else if(str.charAt(j) == '-') {
    				
    				//맨앞일시
    				if(current.prev == null) {
    					continue;
    				}
    				//맨뒤일시
    				else if(current.next == null) {
    					current = current.prev;
    					current.next = null;
    				}
    				//중간일시
    				else {
    					current.prev.next = current.next;
    					current.next.prev = current.prev;

    					current = current.prev;
    				}
    				
    			}
    			else {
    				Node newNode = new Node(str.charAt(j), null, null);
    				
    				//맨앞일시
    				if(current.prev == null) {
    					newNode.prev = current;
    					newNode.next = current.next;
    					

    					if(current.next != null) { //바로 다음 연결리스트가 null인지 확인해야합니다.
    						current.next.prev = newNode;	
    					}
    					current.next = newNode;
    					
    					current = newNode;
    				}
    				//맨뒤일시
    				else if(current.next == null) {
    					newNode.prev = current;
    					newNode.next = current.next;
    					
    					current.next = newNode;
    					
    					current = newNode;
    				}
    				//중간일시
    				else {
    					newNode.prev = current;
    					newNode.next = current.next;
    					
    					current.next.prev = newNode;
    					current.next = newNode;
    					
    					current = newNode;
    				}
    			}
    			
    			
    		}
    		
    		StringBuilder sb = new StringBuilder();
    		Node temp = root.next;
    		while(temp != null) {
//    			System.out.print(temp.value);
    			sb.append(temp.value);
    			temp = temp.next;
    		}
    		System.out.println(sb);
    		
    	}
    }
    
}

class Node{
	char value;
	Node prev;
	Node next;
	public Node(char value, Node prev, Node next) {
		this.value = value;
		this.prev = prev;
		this.next = next;
	}
}

+ Recent posts