#문제
페이지 히스토리를 기억하라. 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 :
- 페이지 이동 최대 횟수가 5이기 때문에 최대 크기 역시 5이다.
- 하지만 5 이하인 경우가 발생할 수 있기 때문에, Vector로 선언 했다.
- 사이즈가 5 이상이 되면, remember_list[0]값을 지우고, remember_list[1] ~ remember_list[5] 값을
- 각각 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를 조금 더 잘 나눴으면 깔끔한 코드가 작성 되었을 것이다.