본문 바로가기
백준

백준 5397: 키로거(java)

by unhyepnhj 2024. 8. 7.

문제


풀이

 

비밀번호와 커서의 이동을 각각 표현할 2개의 스택(password, arrow)을 사용해 풀이한다. '-'를 입력받을 경우 password가 공백 상태가 아니라면 pop하여 커서의 바로 앞 글자를 지우고, '<'나 '>'가 입력되면 password에서 요소를 pop해 arrow에 push하거나 그 반대의 작업을 수행한다.

char c=pw[j];
switch(c) {
	case '-':
		if(!password.isEmpty())
			password.pop();
			break;
	case '<':
		if(!password.isEmpty())
			arrow.push(password.pop());
			break;
	case '>':
		if(!arrow.isEmpty())
			password.push(arrow.pop());
			break;
	default:
		password.push(c);
		break;
}

switch문을 사용하였으나 if문으로 구현해도 무방하다. 

커서 왼쪽의 문자들은 password 스택에, 커서 오른쪽의 문자들은 arrow 스택에 배치한다고 생각하면 간단하다.

'-', '>', '<'를 제외한 나머지 문자들은 커서가 위치한 자리에 그대로 삽입하면 되므로 password 스택에 push해 준다.

while(!arrow.isEmpty())
	password.push(arrow.pop());

문자열 길이만큼 반복을 완료한 후, arrow 스택에 남아 있던 문자들을 모두 password 스택에 push하면 마무리된다.

 

전체 코드

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

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 t=Integer.parseInt(br.readLine());
		for(int i=0; i<t; i++) {
			Stack<Character> password=new Stack<>();
			Stack<Character> arrow=new Stack<>();
			
			char[] pw=br.readLine().toCharArray();
			
			for(int j=0; j<pw.length; j++) {
				char c=pw[j];
				switch(c) {
				case '-':
					if(!password.isEmpty())
						password.pop();
					break;
				case '<':
					if(!password.isEmpty())
						arrow.push(password.pop());
					break;
				case '>':
					if(!arrow.isEmpty())
						password.push(arrow.pop());
					break;
				default:
					password.push(c);
					break;
				}
			}
			
			while(!arrow.isEmpty())
				password.push(arrow.pop());
			
			for(int j=0; j<password.size(); j++) {
				bw.write(password.get(j));
			}
			bw.write("\n");
		}
		bw.flush();
	}
}

빠른 입출력을 위해 BufferedReader와 BufferedWriter를 사용했다. 

'백준' 카테고리의 다른 글

백준 1463: 1로 만들기(java)  (0) 2024.08.09
백준 1874: 스택 수열(java)  (0) 2024.08.07
백준 1302: 베스트셀러(java)  (0) 2024.08.07
백준 1065: 한수(java)  (0) 2024.08.02
백준 1935: 후위 표기식 2(java)  (0) 2024.07.25