문제 : https://school.programmers.co.kr/learn/courses/30/lessons/131704
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 풀이
문제가 굉장히 길지만 정리해보면,
- 번호 순으로 작성된 컨테이너 (que)
- 임시로 값을 저장할 수 있는 컨테이너 (stack)
이렇게 3개로 order 컨테이너의 순서를 몇 개까지 맞출 수 있는지 물어보는 문제이다.
큐와 스택에 대한 이해도를 묻는 문제인거 같고, 난이도는 쉬운 편이었다.
작성한 코드 (정답)
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
class Solution {
public int solution(int[] order) {
int answer = 0;
Queue<Integer> que = new LinkedList<>();
Stack<Integer> stack = new Stack<>();
for (int i = 1; i <= order.length; i++) {
que.add(i);
}
for(int i = 0; i < order.length; i++) {
if (!stack.isEmpty() && order[i] == stack.peek()) {
stack.pop();
answer++;
}
else if (que.isEmpty()) {
return answer;
}
else {
for (;;) {
if (que.isEmpty()) {
break;
}
if (order[i] == que.peek()) {
que.remove();
answer++;
break;
}
stack.push(que.peek());
que.remove();
}
}
}
return answer;
}
}
더 좋은 코드
1. Stack<Integer> 대체
Stack<Integer> stack = new Stack<>();
위의 문법은
Deque<Integer> stack = new ArrayDeque<>();
위와 같이 쓰는 것을 장려한다고 한다. (위 문법이 Stack의 문법을 포함하기에, Stack 문법에 대한 케어가 중단되었다고 한다.)
2. 순회 1회 줄이기
for (int i = 1; i <= order.length; i++) {
que.add(i);
}
다른 사람들의 코드를 보면 int[]를 que로 변경하지 않고 처리한 경우가 많았다. 일단 문제가 요구한 시간 안에 모두 처리가 되어서 코드를 수정하진 않았지만, 시간 초과가 났다면 위 순회를 줄여서 시간을 줄여보려고 했을 것 같다.
'자료구조 & 알고리즘 > 문제 풀이 (프로그래머스)' 카테고리의 다른 글
| 연속된 부분 수열의 합 (투 포인터) (0) | 2026.07.01 |
|---|---|
| 큰 수 만들기 (0) | 2026.06.30 |
| 쿼드압축 후 개수 세기 (백트래킹) (0) | 2026.06.26 |
| 모음 사전 (DFS) (0) | 2026.06.25 |
| 소수 찾기 (DFS) (0) | 2026.06.24 |

