https://school.programmers.co.kr/learn/courses/30/lessons/131704
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
영재가 실어야 하는 택배상자는 크기가 모두 같으며 1번 상자부터 n번 상자까지 번호가 증가하는 순서대로 컨테이너 벨트에 일렬로 놓여 영재에게 전달됩니다.
-> 주 컨테이너는 1번부터 n번까지 순서대로 전달되므로 큐 자료구조를 사용한다.
보조 컨테이너 벨트는 앞 뒤로 이동이 가능하지만 입구 외에 다른 면이 막혀 있어서 맨 앞의 상자만 뺄 수 있습니다(즉, 가장 마지막에 보조 컨테이너 벨트에 보관한 상자부터 꺼내게 됩니다).
-> 보조 컨테이너는 스택 자료구조를 사용한다.
로직
1. 큐와 스택을 생성한다.
2. 큐에 1~n까지 삽입한다.
3. 각 상자 순서마다 다음을 수행한다.
- 큐가 비어있거나 큐 맨앞에 있는 상자가 현재 순서의 상자보다 큰 숫자일 경우, 스택에서 상자를 꺼내야 한다.
스택이 비어있거나 스택 맨 앞에 있는 상자가 현재 순서의 상자와 다르면 break하고, 스택 맨 앞에 있는 상자가 현재 순서의 상자와 같다면 스택에서 꺼낸 후 cnt++
- 큐 맨앞에 있는 상자가 현재 순서의 상자와 같다면, 큐에서 꺼내고 cnt++
- 큐 맨앞에 있는 상자가 현재 순서의 상자보다 작다면, 현재 순서의 상자 전까지 큐에 있는 상자들을 차례대로 스택에 넣고 큐에서 꺼낸다음 cnt++
코드
import java.util.*;
class Solution {
public int solution(int[] order) {
int n = order.length;
Queue<Integer> q = new ArrayDeque<>();
Stack<Integer> st = new Stack<>();
// 1~n까지 큐에 삽입
for (int i = 1; i <= n; i++) {
q.add(i);
}
int cnt = 0;
for (int i = 0; i < n; i++) {
int box = order[i];
if (q.isEmpty() || q.peek() > box) {
// 스택에서 상자 꺼내기
if (st.isEmpty() || st.peek() != box) break;
if (st.peek() == box) {
st.pop();
cnt++;
}
}
else if (q.peek() == box) {
q.poll();
cnt++;
}
else if (q.peek() < box) {
// 큐에 있는 상자들을 차례대로 스택에 넣어야 함
while (q.peek() < box) {
st.push(q.poll());
}
q.poll();
cnt++;
}
}
return cnt;
}
}
다른 풀이
import java.util.*;
class Solution {
public int solution(int[] order) {
int idx = 0;
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < order.length; i++){
stack.push(i+1);
while(!stack.isEmpty()){
if (stack.peek() == order[idx]){
stack.pop();
idx++;
} else break;
}
}
return idx;
}
}
'Algorithm 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.1 : 실패율 - 자바[Java] (0) | 2023.09.30 |
---|---|
[프로그래머스] Lv.2 : 쿼드압축 후 개수 세기 - 자바[Java] (0) | 2023.09.08 |
[프로그래머스] Lv.2 : 롤케이크 자르기 - 자바[Java] (0) | 2023.09.07 |
[프로그래머스] Lv.2 : k진수에서 소수 개수 구하기 - 자바[Java] (0) | 2023.09.06 |
[프로그래머스] Lv.2 : 주차요금계산 - 자바[Java] (0) | 2023.09.05 |