○ 문제 요약
창영이가 강산이의 비밀번호를 알아낼 수 있도록 도와주자!
○ 문제 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int L = Integer.parseInt(br.readLine());
for(int i = 0 ; i < L; i++){
String str = br.readLine();
String password = solution(str);
System.out.println(password);
}
}
public static String solution(String str){
Stack<Character> stack = new Stack<>();
Stack<Character> tmp = new Stack<>();
StringBuilder sb = new StringBuilder();
for(int j = 0 ; j < str.length(); j++){
switch(str.charAt(j)){
case'<':
if(!stack.isEmpty()) tmp.push(stack.pop());
break;
case'>':
if(!tmp.isEmpty()) stack.push(tmp.pop());
break;
case'-':
if(!stack.isEmpty()) stack.pop();
break;
default:
stack.push(str.charAt(j));
break;
}
}
while(!tmp.isEmpty()){
stack.push(tmp.pop());
}
for(int j = 0 ; j < stack.size(); j++){
sb.append(stack.elementAt(j));
}
return sb.toString();
}
}
사용자 정의 함수를 만들지 않고 main 함수에서 다 해결하려고 했는데 이상하게 stack.clear()를 해도 이전 값이 다음 값과 같이 나와서 따로 함수를 정의하고 푸는 방법으로 바꿨다.
문제를 우리가 평소 로그인할 때, 비밀번호를 입력하는 창을 구현한다고 생각하면 쉬울 거 같다.
Stack을 두 개 만들어주고 주 Stack은 stack이 담당하고 서브 Stack은 tmp가 담당한다.
stack에 [B, P]가 들어있고 다음 입력받은 값이 '<'일 경우 B와 P사이에 입력을 해야 하기 때문에 P를 tmp로 옮겨놓고 입력한다.
'>'일 경우 tmp에 옮겨놓은 값을 다시 원래 stack으로 가져오면 된다.
'-'일 경우 문제에서 말했듯이 stack에 마지막에 있는 값을 없애주면 된다.
이밖에 문자나 숫자가 들어오면 stack에 하나씩 넣어준다.
stack에 들어있는 값을 인덱스 순서대로 뽑아서 sb에 저장하고 그 값을 반환해주면 된다.
○ 결과
'문제풀이 > 백준' 카테고리의 다른 글
백준 12018. Yonsei TOTO(JAVA) (0) | 2022.06.10 |
---|---|
백준 1697. 숨바꼭질 (JAVA) (0) | 2022.05.19 |
백준 1620. 나는야 포켓몬 마스터 이다솜 (0) | 2022.05.18 |
백준 10816. 숫자 카드2 (JAVA) (0) | 2022.05.17 |
백준 1920. 수 찾기(JAVA) (0) | 2022.05.16 |