성능 요약
- 메모리: 123 MB, 시간: 33.14 ms
구분
- 코딩테스트 연습 > 스택, 구현
Answer Code1(23.10.23)
import java.util.*;
/**
* main_con : 메인 컨테이너
* sub_con : 서브 컨테이너
* 주문 갯수만큼 for 문 돌리면서
* 1) 현재 순서와 맞는 택배 상자가 올때까지 서브 컨테이너 벨트에 저장한다.
* 1-1) 메인 컨테이너의 현재 위치에 있는 값과 일치하면 break;
* 1-2) 서브 컨테이너가 비어있지 않고, 서브 컨테이너의 현재 위치에 있는 값과 일치하면 break;
* 1-3) 메인, 서브에 있는 값과 일치하지 않으면 1 증가시켜 1-1로 되돌아간다.
* 2) 서브 컨테이너(Stack)에 다 저장되었으면 탐색 시작한다.
* 2-1) 메인 컨테이너의 현재 위치에 있는 값과 일치하면 정답 갯수 +1 증가
* 2-2) 서브 컨테이너가 비어있지 않고, 서브 컨테이너의 현재 위치에 있는 값과 일치하면 서브 컨테이너 pop()하고 정답 갯수 + 1 증가
* 2-3) 메인, 서브에 있는 값과 일치하지 않으면 종료
*/
class Solution {
public int solution(int[] order) {
int answer = 0;
int main_con = 1;
Stack<Integer> sub_con = new Stack<>();
for(int o : order) {
while(main_con <= order.length) { // 1
if(main_con == o) break; // 1-1
else if(!sub_con.isEmpty() && sub_con.peek() == o) // 1-2
break;
else { // 1-3
sub_con.push(main_con);
main_con++;
}
}
// 2
if(main_con == o) { // 2-1
answer++;
main_con++;
} else if(!sub_con.isEmpty() && sub_con.peek() == o) // 2-2
{
sub_con.pop();
answer++;
} else // 2-3
{
break;
}
}
return answer;
}
}
문제 풀이
-
해당 문제는 두개의 컨테이너 벨트가 존재한다.
-
메인 컨테이너는 택배박스를 트럭에 싣기 전에 1부터 n까지 순서대로 놓여져 있는 메인 컨테이너 벨트이고,
-
서브 컨테이너는 순서에 맞지 않는 택배박스를 임시로 놓는 서브 컨테이너 벨드이다.
-
해당 문제에서 우리는 주어진 순서에 해당하는 택배 박스를 메인 또는 서브 컨테이너 벨트에 있는지 확인하고, 이것을 트럭에 싣는 것이다.
-
만약에 메인 컨테이너에 없다면 -> 서브 컨테이너 벨트의 맨 앞의 상자를 확인하고 -> 서브 컨테이너에도 없다면 택배 상자를 서브 컨테이너 벨트에 보관하고, 메인 컨테이너 벨트에서 다음 택배 상자를 확인한다.
할 일을 정리해보면 다음과 같다.
- 정해진 순서에 따른 택배 박스를 확인한다. -> 반복문 이용
- 메인 컨테이너에 있는 상자가 현재 배달하는 순서와 같으면 트럭에 실고
- 그게 아니라면, 서브 컨테이너에 있는 상자를 확인한다.
- 서브 컨테이너에 있는 상자가 현재 배달하는 순서와 같으면 트럭에 실고
- 그게 아니라면, 다음 택배 상자를 확인한다.
- 만약 메인 컨테이너와 서브 컨테이너 벨트의 맨 앞에 있는 상자와 순서가 다르면 종료한다.
Review
- 문제를 이해하는데 시간을 오래 잡아먹었지만, 이해하기에는 크게 어려움이 없었다.
- 다만, 반복문을 어딴 기준을 세우고 해야 할지 감을 잡기 어려웠고, 그래서 그림을 그려서 이해하도록 노력했다.
- 스택의 문법과 구현에 대한 과정을 알 수 있어서 좋은 문제라고 생각한다.