본문 바로가기

algorithm/code

[JAVA] 페이지 이동 히스토리 기록

#문제

페이지 히스토리를 기억하라. answer는 모든 페이지 이동 경로를 기억하며, 페이지 히스토리는 최근 5개의 페이지 이동 경로를 기억한다. 처음 실행될 때, 페이지는 0페이지 이다. 페이지는 최대 100페이지까지 있다.

 

#입력값 예시

[다음 페이지로 이동] : 다음 페이지로 이동

[이전 페이지로 이동] : 이전 페이지로 이동

[페이지 히스토리 뒤로 가기] : 최대 5개로 저장된 히스토리에서 뒤로 이동

[페이지 히스토리 앞으로 가기] : 현재 열람한 히스토리 페이지의 앞으로 이동

[지정한 페이지로 이동 : n 페이지로 이동] : n 페이지로 이동한다

**주의할 점 : 페이지 히스토리 이동 시에는, 히스토리를 열람하는 것이기 때문에, 새로 추가되는 히스토리 없다.**

 

#예시

#1

## 다음 페이지로 이동

## 다음 페이지로 이동

## 다음 페이지로 이동

## 이전 페이지로 이동

## 이전 페이지로 이동

## 지정한 페이지로 이동 : 7 페이지로 이동

## 페이지 히스토리 뒤로 가기

출력 : 1, 2, 3, 2, 1, 7, 1

 

#2

## 다음 페이지로 이동

## 다음 페이지로 이동

## 이전 페이지로 이동

## 지정한 페이지로 이동 : 10 페이지로 이동

## 지정한 페이지로 이동 : 3 페이지로 이동

## 페이지 히스토리 뒤로 가기

## 페이지 히스토리 뒤로 가기

## 페이지 히스토리 뒤로 가기

## 페이지 히스토리 앞으로 가기

출력 : 1, 2, 1, 10, 3, 10, 1, 2, 1

 

#풀이방법

answer :  페이지 이동 횟수가 얼만큼 나올지 모르기 때문에, Vector를 사용해서 선언.

remember_list :

  1. 페이지 이동 최대 횟수가 5이기 때문에 최대 크기 역시 5이다.
  2. 하지만 5 이하인 경우가 발생할 수 있기 때문에, Vector로 선언 했다.
  3. 사이즈가 5 이상이 되면, remember_list[0]값을 지우고, remember_list[1] ~ remember_list[5] 값을 
  4. 각각 remember_list[0]~remember_list[4]로 이동하면서, remembe_list 사이즈를 5로 고정.

입력 값을 String으로 받고, switch - case 문을 이용해 새로운 String이 입력될 때 마다 처리를 해줬다.

처리해준 값을 answer에 매번 추가해주는 방법을 선택했다.

  -> 모든 String을 입력받은 후에 처리를 하려면 while문을 두번 써야해서 조금 귀찮았다.

입력이 아무것도 오지 않는 경우에 while문을 break 하고, answer를 출력했다.

  -> if (input_comm.length() < 3) break;

 

import java.util.Scanner;
import java.util.Vector;

public class Main {
	
	 public static void main(String[] args) {
		 Vector<Integer> answer = new Vector<Integer>();
		 Vector<Integer> remember_list = new Vector<Integer>();
		
		 int now_page = 0;
		 
		 Scanner scan = new Scanner(System.in);
		 
		 String input_comm;
	     
	     int history = 5;
	     int cir=0;
		 while(true) {
			 input_comm = scan.nextLine();
			 if(input_comm.length() < 3) break;
			 cir+=1;
			 if(cir<5) history=cir;
			 
		     switch(input_comm) {
		     case "다음 페이지 이동" :
		    	 history=5;
		    	 now_page+=1;
				 answer.addElement(now_page);
				 remember_list.addElement(now_page);
				 break;
			 case "이전 페이지 이동" :
				 history=5;
				 now_page-=1;
				 answer.addElement(now_page);
				 remember_list.addElement(now_page);
				 break;
			 case "페이지 히스토리 뒤로 가기":
				 history-=1;
				 answer.addElement(remember_list.get(history - 1));
				 break;
			 case "페이지 히스토리 앞으로 가기":
				 history+=1;
				 if(history>5) history=5;
				 answer.addElement(remember_list.get(history-1));
				 break;
			 default:
				 String restr = input_comm.replaceAll("[^0-9]", "");
				 int to=Integer.parseInt(restr);
				 answer.addElement(to);
				 remember_list.addElement(to);
				 break;
		     }
		     
		     if(remember_list.size()>5) {
		    	 for(int a=1; a<6;a++) {
		    		 remember_list.setElementAt(remember_list.get(a),a-1 );
		    	 }
		    	 remember_list.removeElementAt(5);
		     } 
		 }
	    
		 for(int i=0; i<answer.size() - 1;i++) {
			 System.out.print(answer.get(i));
			 System.out.print(",");
		 }
		 System.out.print(answer.get(answer.size()-1));
	 }
}

 

 

#새로 배운점

## str.replaceAll("[^0-9]","") 를 하면, str 에서 숫자 부분만 추출해준다.

    str.replaceAll("[\\D\","") 도 사용 가능.

 

#아쉬웠던 점

## remember_list를 Queue로 작성했으면 훨씬 좋았을 것 같다. Java를 오랜만에 사용해서, 부족한 면이 있는 코드이다.

## class를 조금 더 잘 나눴으면 깔끔한 코드가 작성 되었을 것이다.