조건
새로운 페이지로 접속할 경우 prev 스택에 원래 있던 페이지를 넣고 next 스택을 비웁니다.
뒤로 가기 버튼을 누를 경우 원래 있던 페이지를 next 스택에 넣고 prev 스택의 top에 있는 페이지로 이동한 뒤 prev 스택의 값을 pop 합니다.
앞으로 가기 버튼을 누를 경우 원래 있던 페이지를 prev 스택에 넣고 next 스택의 top에 있는 페이지로 이동한 뒤 next 스택의 값을 pop 합니다.
브라우저에서 뒤로 가기, 앞으로 가기 버튼이 비활성화일 경우(클릭이 되지 않을 경우)에는 스택에 push 하지 않습니다.
입출력 예시
String[] actions = new String[]{"B", "C", "-1", "D", "A", "-1", "1", "-1", "-1"};
String start = "A";
ArrayList<Stack> output = browserStack(actions, start);
System.out.println(output); // [["A"], ["B"], ["A", "D"]]
String[] actions2 = new String[]{"B", "-1", "B", "A", "C", "-1", "-1", "D", "-1", "1", "E", "-1", "-1", "1"};
String start2 = "A";
ArrayList<Stack> output2 = browserStack(actions2, start2);
System.out.println(output2); // [["A", "B"], ["D"], ["E"]]
수도코드
/*
1. 뒤로가기
반복문으로 actions요소 확인하기
if( actions의 요소가 -1이고 이전페이지 항목이 null값이 아니면 ){
현재페이지를 다음페이지로 넣는다
이전페이지의 top요소를 현재페이지로 가져온다
}
2. 앞으로 가기
else if(actions의 요소가 1이고 다음페이지 항목이 null값이 아니면){
현재페이지를 이전페이지로 넣는다
다음페이지의 top요소를 현재페이지로 가져온다
}
3. 이전스택, 다음스택이 null인 경우 (=앞으로가기, 뒤로가기가 비활성화가 되어있다면)
else if(요소가 -1이거나 1인데 앞에서 걸러지지 못한 null값인 경우){아무처리하지 않는다}
4. 새로운 페이지로 접속한 경우
else{
이전페이지에 현재페이지를 넣는다.
현재페이지에 actions[i]를 실행한다
next을 비운다.
}
5. 각 값을 결과값에 추가한다.
결과를 리턴한다.
*/
코드작성
import java.util.*;
public class Solution {
public ArrayList<Stack> browserStack(String[] actions, String start) {
Stack<String> prevStack = new Stack<>(); // 이전페이지
Stack<String> nextStack = new Stack<>(); // 다음페이지
Stack<String> current = new Stack<>(); // 현재페이지
ArrayList<Stack> result = new ArrayList<>(); // 결과값 저장(배열, 시작점)
current.push(start);
for(int i=0; i<actions.length; i++){
if(actions[i].equals("-1") && !prevStack.empty()){ //뒤로가기
nextStack.push(current.pop());
current.push(prevStack.pop());
}else if(actions[i].equals("1")&& !nextStack.empty()){ //앞으로가기
prevStack.push(current.pop());
current.push(nextStack.pop());
}else if(actions[i].equals("1")||actions[i].equals("-1")){ // 앞에서 실행안된, 이전요소나 다음요소가 null값인 요소는 처리하지 않기
}else{
prevStack.push(current.pop());
current.push(actions[i]);
nextStack.clear();
}
}
result.add(prevStack);
result.add(current);
result.add(nextStack);
return result;
}
}