[SEB BE] Section 2. Stack 브라우저 뒤로가기 앞으로 가기

박두팔이·2023년 1월 16일
0

알고리즘

목록 보기
2/12

스택으로 브라우저 뒤로가기 앞으로가기문제

조건

  1. 새로운 페이지로 접속할 경우 prev 스택에 원래 있던 페이지를 넣고 next 스택을 비웁니다.

  2. 뒤로 가기 버튼을 누를 경우 원래 있던 페이지를 next 스택에 넣고 prev 스택의 top에 있는 페이지로 이동한 뒤 prev 스택의 값을 pop 합니다.

  3. 앞으로 가기 버튼을 누를 경우 원래 있던 페이지를 prev 스택에 넣고 next 스택의 top에 있는 페이지로 이동한 뒤 next 스택의 값을 pop 합니다.

  4. 브라우저에서 뒤로 가기, 앞으로 가기 버튼이 비활성화일 경우(클릭이 되지 않을 경우)에는 스택에 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;
    }
}    	
profile
기억을 위한 기록 :>

0개의 댓글