728x90
반응형
SMALL
위 문제는 글이 매우 길다. 이러한 문제들은 글에서 힌트를 얻을 수 있기 때문에 입력과 출력조건을 읽기전에 천천히 읽어보자.
이런 힌트를 확인할 수 있다.
이 글을 제대로 읽지 않았다면 홀로 외롭게 재귀문제라고 판단되어 열심히 무한호출 코드를 돌리고있을것이다....(절대 경험담 아님)
이 힌트외에는 꼼꼼히 파악해야 할 부분이 하나 더 있다.
해당 순서가 아닌 사람들은 1열로 들어갈 수 있는 공간에 차례대로 집어넣는다.
대기열에서 해당 순번인 사람을 꺼낼 때 해당 순번인지 스택에서도 확인하는 절차가 필요하다.
예를 들어 , 13245 의 입력을 받았다. 대기열에는 13245가 순서대로 서있는것이다.
위 문제대로 풀어보면 다음과 같다.
1. 1번이 바로 입장한다. 3245가 대기열에 있다.
2. 3번은 다음 순서가 아니기때문에 스택에 들어간다. 대기열(245) , 스택(3)
3. 2번 순서는 대기열에 있기 때문에 2를 입장시킨다. 대기열(45) 스택(3)
4. 3번 순서는 대기열이 아닌 스택에 있다. 스택에서 3을 입장시킨다. 대기열(45) << 이 과정을 가장 많이 빼먹는 부분
...
5. 순서대로 4,5가 입장한다.
절차는 아래와 같다.
1. 문제를 자세히 읽고 힌트 파악
2. 입력에서 학생들의 수를 파악한다. N은 최대 1000이다. 모든 입력을 한 번씩만 순회하면 되기에 O(N)의 시간복잡도를 갖는다.
3. 대기열과 1열로 들어갈수 있는 공간을 만들어서 조건에 맞게 코드를 구현해준다.
package Stack;
import java.util.*;
public class StackP12789 {
static int N;
static Queue<Integer> list ;
static Stack<Integer> st ;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
/*
* 현재 줄 서있는곳 (Queue)
* 한 명씩 서 있을 수 있는 곳 (Stack)
*
* 1. 현재 줄 서 있는곳의 인원을 모두 빼서 1부터 차례대로 입장
* 2. 순서가 아닌 사람들은 Stack으로 이동
* 3. Stack에서 순서대로 입장(순서대로 입장이 안되면 Sad)
*
* 실수한 점
* 2번에서 이동 후 stack에 이미 사람이 있다면 stack에서도 번호가 일치하는지 추가로 확인해야함
* */
N = sc.nextInt();
list = new LinkedList<>();
st = new Stack<>();
for (int i = 0; i < N; i++) {
list.add(sc.nextInt());
}
int idx = 1;
while (list.size() != 0) {
if(list.peek()==idx) {
list.poll();
idx++;
}else if(!st.isEmpty() && st.peek() == idx){
st.pop();
idx++;
}
else {
st.push(list.poll());
}
}
while (!st.isEmpty()) {
if (st.peek() == idx) {
st.pop();
idx++;
}
else{
break;
}
}
System.out.println(st.isEmpty()?"Nice" : "Sad");
}
}
728x90
반응형
SMALL
'문제 풀이 > 백준 문제풀이' 카테고리의 다른 글
[백준11047 - Java] 구현 - 주사위 굴리기 (1) | 2024.04.23 |
---|---|
[백준11047 - Java] 동전 0 Greedy 알고리즘으로 풀 (1) | 2024.03.26 |
[백준 1427 - 자바/ 선택정렬] 소트인사이드 (0) | 2024.03.20 |
[백준 - 1715/ java] 카드정렬하기 - 우선순위 큐 (0) | 2024.03.18 |
[백준 2164-Java ] 카드2 + Queue에 대한 설명 (0) | 2024.03.17 |