[BAEKJOON] - 5397번 키로거

Kim Hyen Su·2024년 1월 15일
0

⏲️ 알고리즘

목록 보기
40/95

백준 5397번 링크

처음 문제를 읽고난 뒤에 요소를 추가/삭제 하는 횟수가 많다고 판단하여 이에 유리한 자료구조인 링크드 리스트(Linked-List) 구조를 선택하였다.

😒 실패

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int testCase = Integer.parseInt(br.readLine());
        
        StringBuilder sb = new StringBuilder();
        for(int i=0; i < testCase; i++){
            char[] chars = br.readLine().toCharArray();

            int cursor = 0;
            List<Character> li = new LinkedList<>();
            
            for(int j = 0; j < chars.length; j++){
                char ch = chars[j];
                
                if(ch == '<'){
                    cursor = cursor > 0 ? cursor - 1 : 0;
                    continue;
                }else if(ch == '>'){
                    cursor = cursor < li.size() ? cursor + 1 : li.size();
                    continue;
                }else if(ch == '-'){
                    if(li.size() >= 1 && cursor > 0){
                        li.remove(cursor-1);
                    }
                    continue;
                }

                li.add(cursor,ch);
                cursor++;
            }
            String res = li.stream().map(String::valueOf).collect(Collectors.joining());
            sb.append(res).append('\n');
        }

        br.close();
        System.out.println(sb);
    }
}

계속 IndexOutOfBounds 런타임 에러가 발생하였다. 어느 부분에서 발생하는지 조차 가늠이 안된다.

결국엔, 제한시간 1시간을 초과하여 다른 유저의 풀이를 참고하게 되었다. 참고해보니, 커서를 정수값으로 사용하지 않고, 웹페이지의 뒤로가기/앞으로 가기와 같이 Stack 2개를 사용하여 구현할 수 있다는 것을 깨달았다.

최근 기능들을 구현하거나 알고리즘 문제를 풀면서 공통적으로 나타나는 습관 중 하나가 보이기 시작했다.

한 방식으로 구현하고자 마음 먹으면, 그 방식으로만 구현하려고 하다보니 사고가 좁아진다는 생각이 들었다.

이번을 계기로 알고리즘 문제 풀이 또는 프로젝트 기능 구현 시에 다양한 방법으로 접근할 수 있다라는 생각을 잊지 말아야 겠다.

😀 성공

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.io.BufferedReader;
import java.io.BufferedWriter;

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));
		int testCase = Integer.parseInt(br.readLine());
		
		for(int i=0; i<testCase; i++) {
			String line = br.readLine();
			Stack<Character> prevStack = new Stack<>();
			Stack<Character> nextStack = new Stack<>();
			for(int j=0; j<line.length(); j++) {
				char ch = line.charAt(j);
				if(ch == '<') {
					if(!prevStack.isEmpty()) {
						nextStack.push(prevStack.pop());
					}
				}else if(ch == '>') {
					if(!nextStack.isEmpty()) {
						prevStack.push(nextStack.pop());
					}
				}else if(ch == '-') {
					if(!prevStack.isEmpty()) {
						prevStack.pop();
					}
				}else {
					prevStack.push(line.charAt(j));
				}
			}
			
			while(!nextStack.isEmpty()) {
				prevStack.push(nextStack.pop());
			}
			
			for(int k=0; k<prevStack.size(); k++) {
				bw.write(prevStack.get(k));
			}
			bw.write("\n");
		}
		
		bw.flush();
		bw.close();
		
	}
}

참고 링크
https://loosie.tistory.com/354

profile
백엔드 서버 엔지니어

0개의 댓글