/**
* [접시무더기]
* 접시무더기를 생각, 접시를 너무 높이 쌓으면 무너짐
* 따라서 현실에서는 접시를 쌓다가 무더기가 어느정도 높아지면 새로운 무더기를 만듬
* 이것을 흉내내는 자료구조 SetOfStacks를 구현하라
* SetOfStacks는 여러개의 스택으로 구성되어 있으며
* 이전 스택이 지정된량을 초과하는 경우 새로운 스택을 생성
*
* [연관문제]
* 특정 하위 스택에 대해 pop을 수행하는 popAt(int index)를 만들어라
*
* [풀이]
* => 접시당 크기는 ?
* => 접시 무더기를 ArrayList로 구현해도 되는가 ?
* => 주어진 자바의 스택으로 사용해도 되는가 ?
*
* */
public class Q03 {
/* Main */
public static void main(String[] args) {
SetOfStacks sos = new SetOfStacks(3);
sos.push(1);
sos.push(2);
sos.push(3);
sos.push(4);
sos.push(5);
sos.push(6);
sos.push(7);
System.out.println(sos.pop());
System.out.println(sos.pop());
System.out.println(sos.pop());
System.out.println(sos.pop());
System.out.println(sos.pop());
System.out.println(sos.pop());
System.out.println(sos.pop());
}
/* Field */
int INNER_STACK_SIZE = 3;
/* SetOfStacks */
public static class SetOfStacks {
// == Feild ==
List<Stack<Integer>> stacks;
Stack<Integer> nowStack;
int innerStackSize;
// == Constructor ==
public SetOfStacks(int innerStackSize) {
this.stacks = new ArrayList<>();
this.innerStackSize = innerStackSize;
}
// == push ==
public void push(int a) {
if(stacks.size() == 0) {
// == first init ==
initChild();
}
else {
if(nowStack.size() == innerStackSize) {
// == new init ==
initChild();
}
}
nowStack.push(a);
}
// == pop ==
public Integer pop() {
if(stacks.size() != 0) {
int rtn = nowStack.pop();
// == nowStack 정리 ==
if(nowStack.size() == 0) {
stacks.remove(nowStack);
if(stacks.size() == 0) {
nowStack = null;
} else {
nowStack = stacks.get(stacks.size() - 1);
}
}
return rtn;
}
return null;
}
// == initChild ==
public void initChild() {
nowStack = new Stack();
stacks.add(nowStack);
}
}
}
'CS > 자료구조 문제' 카테고리의 다른 글
문제 // 자료구조 // 문자열(String) // 순열검증 // toJava (0) | 2018.08.03 |
---|---|
문제 // 자료구조 // 문자열(String) // 중복확인 // toJava (0) | 2018.08.03 |
문제 // 자료구조 // 큐(Queue) // 병합큐 // toJava (0) | 2018.08.02 |
문제 // 자료구조 // 스택(Stack) // StackSort // toJava (0) | 2018.08.02 |
문제 // 자료구조 // 스택(Stack)과 큐(Queue) // 두 스택으로 큐 만들기 // toJava (0) | 2018.08.02 |