https://school.programmers.co.kr/learn/courses/30/lessons/131704
package Programmers;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class 택배상자 {
public static void main(String[] args){
택배상자 T = new 택배상자();
int[] order = {5, 4, 3, 2, 1};
// 2 3
T.solution(order);
}
public int solution(int[] order) {
int answer = 0;
int point = 0;
Queue<Integer> qMain = new LinkedList<>();
Stack<Integer> sSub = new Stack<>();
//1 ~ order.length 까지의 수를 qMain 에다가 담는다.
for (int i = 1; i <= order.length; i++) {
qMain.offer(i);
}
//qMain 이 빌때까지 while 문을 돈다.
while (!qMain.isEmpty()){
int pos = order[point]; //지금담아야되는 물건번호
int mBelt = qMain.poll();
//현재 벨트위에있는 물건과 담아야되는 물건이 같으면
if(mBelt == pos){
point++;
if(point >= order.length) break;
pos = order[point];
}else{ //다르면 보조벨트에다가 집어넣는다.
sSub.push(mBelt);
}
//보조벨트에서 물건을 빼준다. 택배기사가 원하는거하고 다를때까지
while (sSub.size() > 0 && sSub.peek() == pos){
sSub.pop();
point++;
if(point >= order.length) break;
pos = order[point];
}
}
answer = point;
return answer;
}
}
1. 문제
- 문제 이해하는데 오래걸렸다. 주어진 배열 order는 택배기사가 넣고싶은 순서다.
- 기본적으로 컨베이어 벨트에는 1 ~ order.length 까지 순서대로 깔려있고 1부터 빠져나온다.
- 1부터 빠져 나오는데 못담는건 보조벨트에다가 갖다 넣고, 보조벨트는 FILO (First In, Last Out) Stack 쓰라는거다.
- 총 몇개의 상자를 실을수 있는지 result 구하는 문제
2. 풀이
2.1 ) qMain 에다가 컨베이어 벨트를 만든다. 1부터 order.length 까지 차례로 que에다가 담는다.
2.2 ) qMain이 비거나, point(택배기사가 원하는 물건의 위치) 가 order.length 이상이면 탈출
2.3 ) 벨트위 물건과 담아야되는 물건이 같으면 point 증가시켜주고 원하는 물건(pos) 의 값 변경 해준다.
2.4 ) 원하지 않는 물건이다 하면 sSub 보조벨트에다가 추가 해준다.
2.5 ) 보조벨트에서 물건을 빼준다. 택배기사가 원하는물건과 다를때까지
최종적으로 point 의 위치가 answer 가 된다.
※ 문제만 이해하면 답은 생각보다 간단함. 문제가 ㅈㄹ 맞음, 지문읽고 바로 이해할수 있는사람이 있는건가.
예시가 좀더 있었으면 금방 풀었을것 같은데
'기타 > 알고리즘' 카테고리의 다른 글
[알고리즘] 프로그래머스 - 혼자놀기의달인 Lv2 JAVA (0) | 2023.05.12 |
---|---|
[알고리즘] 프로그래머스 - 연속 부분 수열 합의개수 Lv2 Java (0) | 2023.05.12 |
[알고리즘] 프로그래머스 - 롤케이크자르기 LV.2 java (1) | 2023.05.10 |
[알고리즘] 프로그래머스 - 콜라문제 LV.1 JAVA (0) | 2023.05.10 |
[알고리즘] 프로그래머스 - 과일장수 Lv1 Java (0) | 2023.05.10 |