프로그래머스 2단계 택배상자를 풀어보겠습니다.
※ 문제 설명을 이해하신 분들은 스킵하셔도 됩니다!
문제 설명을 간단하게 하겠습니다.
- 영재는 컨베이어 벨트에서 일렬로 오는 택배상자를 트럭에 싣는 일을 합니다.
-> 컨베이어 벨트에는 1번부터 n까지의 상자가 오름차순으로 영재에게 옵니다.
- 택배 기사님이 원하는 상자 순서대로 트럭에 싣어야 합니다.
-> 배열 'order'는 택배 기사님이 원하는 상자 순서를 나타내는 정수 배열입니다.
- '컨베이어 벨트'에서 온 상자가 택배 기사님이 원하는 상자가 아닐 경우, '보조 컨베이어 벨트'에 올려놓을 수 있습니다.
- '보조 컨베이어 벨트'에서 택배 기사님이 원하는 박스를 꺼내 트럭에 싣을 수 있습니다.
-> 단, '보조 컨베이어 벨트'에서는 영재가 가장 최근에 넣은 상자부터 꺼낼 수 있습니다. (넣은 순서와 반대)
- 영재가 트럭에 싣은 상자의 개수를 반환합니다.
입출력 예시 1번을 그림으로 설명하겠습니다.
※ 제가 푼 방법보다 더 좋은 방법으로 풀 수 있기 때문에, 참고용으로만 봐주셨으면 좋겠습니다.
import java.util.Stack;
class Solution {
public int solution(int[] order) {
// 보조 컨베이어 벨트
Stack<Integer> assistance = new Stack<>();
// 트럭에 싣은 상자의 개수
int answer = 0;
// 택배 기사님이 원하는 상자 번호를 가져오기 위한 index
int i = 0;
// 반복문은 컨베이어 벨트를 의미 (가장 높은 상자 번호는 order의 length)
for(int box = 1; box <= order.length; box++)
{
// 컨베이어 벨트에서 온 상자가 택배 기사님이 원하는 상자 번호가 아닌 경우
if(order[i] != box)
{
// 보조 컨베이어 벨트에 상자 추가
assistance.add(box);
continue;
}
// 컨베이어 벨트에서 온 상자가 택배 기사님이 원하는 상자 번호일 경우
// 택배 기사님이 원하는 다음 상자를 가져오고, 트럭에 싣은 상자 개수 증가
i++;
answer++;
// 보조 컨베이어 벨트에 다음 상자가 있는지 확인
while (assistance.size() != 0 && order[i] == assistance.peek())
{
// 보조 컨베이어 벨트에 만족하는 상자 번호가 있으므로 보조 컨베이어 벨트에서 빼고 트럭에 싣기
assistance.pop();
i++;
answer++;
}
}
return answer;
}
}
import java.util.*;
public class Test {
static class Solution
{
// 본인 코드 복붙!
}
static class Source
{
Random random;
int[] order;
Source()
{
random = new Random();
order = new int[random.nextInt(10)+1];
setOrder();
}
public void setOrder()
{
for(int i = 0; i < order.length; i++)
{
int box;
do {
box = random.nextInt(order.length)+1;
} while (!chkDuplicatedBox(i,box));
order[i] = box;
}
}
public boolean chkDuplicatedBox(int index, int box)
{
for(int i = 0; i < index; i++)
{
if(order[i] == box)
return false;
}
return true;
}
}
static class Answer {
public static int solution(int[] order) {
int answer = 0;
Stack<Integer> assistance = new Stack<>();
int i = 0;
for(int box = 1; box <= order.length; box++)
{
if(order[i] != box)
{
assistance.add(box);
continue;
}
i++;
answer++;
while (assistance.size() != 0 && order[i] == assistance.peek())
{
assistance.pop();
i++;
answer++;
}
}
return answer;
}
}
public static void main(String[] args) {
Source source;
Solution solution = new Solution();
for (int i = 0; i < 100; i++)
{
source = new Source();
int a = Answer.solution(source.order);
int s = solution.solution(source.order);
if(a == s) continue;
System.out.println("주어진 order: "+Arrays.toString(source.order));
System.out.println("정답 코드 답: "+a);
System.out.println("내 코드 답: "+s+"\n");
}
}
}
와.. 너무 감사합니다! 이해가 어렵던 문제였는데ㅠㅠ