이번에는 다음 문제를 해결해보았다.
내가 해결한 모양새는 대충 이렇다.
실행부 말고, Stack을 구현한 클래스 내용만 살짝 올려본다.
1. 변수, 예외, 생성자
//변수
private int max;
private int ptrA;
private int ptrB;
private int[] stk;
//예외
public class EmptyStack3Exception extends RuntimeException {
public void EmptyStack3Exception() {}
}
public class OverflowStack3Exception extends RuntimeException {
public void OverflowStack3Exception() {}
}
//생성자
public Stack3(int capacity) {
max = capacity;
try {
stk = new int[max];
ptrA=0; ptrB=max-1;
} catch (OutOfMemoryError e) {
max = 0;
}
}
2. 메소드 - 간단히 팝, 푸쉬, 픽만 해보았다.
public int size() {
return ptrA+(max-1)-ptrB;
}
public int pushA(int x) throws OverflowStack3Exception {
if(ptrA>=ptrB)
throw new OverflowStack3Exception();
return stk[ptrA++] = x;
}
public int pushB(int x) throws OverflowStack3Exception{
if(ptrB<=ptrA)
throw new OverflowStack3Exception();
return stk[ptrB--] = x;
}
public int popA() throws EmptyStack3Exception{
if(ptrA<=0)
throw new EmptyStack3Exception();
return stk[--ptrA];
}
public int popB() throws EmptyStack3Exception{
if(ptrB>=max-1)
throw new EmptyStack3Exception();
return stk[++ptrB];
}
public int peekA() throws EmptyStack3Exception{
if(ptrA<=0)
throw new EmptyStack3Exception();
return stk[ptrA-1];
}
public int peekB() throws EmptyStack3Exception{
if(ptrB>=max-1)
throw new EmptyStack3Exception();
return stk[ptrB+1];
}
답안과의 차이점
스택A, B 선택하는 구조의 차이
나는 사용자가 값을 push, pop, peek할 때 스택A냐 스택B냐를 선택(입력)받도록 했다. 그래서 메인 메서드에 Scanner를 통해여 A인지 B인지 입력받고, 그 입력조건에 따라 pushA, pushB가 실행되도록 했다.
반면 답안에서는 enum인 AorB 타입을 선언하여 그 값이 StackA 혹은 StackB가 되도록 했다.
public enum AorB {
StackA, StackB
};
그리고 모든 메소드의 인자에 AorB타입 객체가 들어가도록 메소드를 구현했다. 메소드 안에는 switch문에 따라 case1: StackA, case2: StackB를 이용하여 인자에 들어오는 객체가 StackA인지 StackB인지에 따라서 알맞게 기능하도록 구현했다.
// 푸시
public int push(AorB sw, int x) throws OverflowIntStackX2Exception {
if (ptrA >= ptrB + 1)
throw new OverflowIntStackX2Exception();
switch (sw) {
case StackA:
stk[ptrA++] = x;
break;
case StackB:
stk[ptrB--] = x;
break;
}
return x;
}
public int pop(AorB sw) throws EmptyIntStackX2Exception {
int x = 0;
switch (sw) {
case StackA:
if (ptrA <= 0) // 스택 A가 비어 있음
throw new EmptyIntStackX2Exception();
x = stk[--ptrA];
break;
case StackB:
if (ptrB >= max - 1) // 스택 B가 비어 있음
throw new EmptyIntStackX2Exception();
x = stk[++ptrB];
break;
}
return x;
}
이런식으로 말이다.
여기서 새로 배워간 것은, enum의 활용 예시이다. 지금까지 문제를 풀면서 딱히 열거타입을 사용할 생각을 하지 않았다. 이번 답안을 보면서 이렇게 열거타입을 적절히 활용하는 상황을 만나보았다.
'자료구조 + 알고리즘' 카테고리의 다른 글
[알고리즘] 하노이의 탑 알고리즘 이해 돕기 | 재귀함수 과정 (6) | 2021.07.08 |
---|---|
재귀의 제거 | Stack에 잠시 저장해두기 | 재귀의 과정 이해 | 비재귀적 구현해보기 (0) | 2021.07.08 |
[자료구조] 스택, 제네릭 스택 | 제네릭 배열 생성시 유의해야할 점 | 강제형변환 (0) | 2021.06.29 |
이진 검색 - 중복요소의 맨 앞 인덱스 찾아내기 | 반복문의 유연한 사용이 필요하겠다. (0) | 2021.06.28 |
이진 검색 과정을 출력하는 프로그램 작성하기 (0) | 2021.06.28 |