Written

프로그래머스 레벨2 <택배상자> C++ 풀이 본문

알고리즘 문제풀이

프로그래머스 레벨2 <택배상자> C++ 풀이

steeringhead 2023. 9. 6. 12:21

두개의 컨테이너 벨트를 사용해서 주어진 order에 맞게 택배를 담을 수 있게 하는 것이 문제 해결의 요지였습니다. 서브 컨테이너가 마치 자료구조의 Stack과도 같은 구조를 하고 있기 때문에 두 개의 vector를 통해 어렵지 않게 해결이 가능한 문제였습니다.

 

하나 주의해야할 부분은 서브 컨테이너에 옮기다가 order에 맞게 택배 상자를 실은 다음에, 다음 차례로 실어야 하는 박스 번호가 서브 컨테이너와 메인 컨테이너에서 곧 장 꺼낼 수 없다고 하더라도 더 실을 수 있는 경우가 존재하는 것 입니다.

메인컨테이너가 비어있는게 아니라면 서브컨테이너에 다시 옮기면서 이번에 실어야 하는 박스번호를 찾아서 옮길 수 있는 경우가 존재합니다. 처음 풀이에는 저도 문제에 나와있는 테스트케이스만 보고 그대로 구현하다보니 이부분을 놓쳤지만, 채점에서 틀리는 테케가 많은것을 보고 다시 풀면서 정답을 받을 수 있었습니다. (answer가 1로 시작하는 이유는 어떤 경우라도 무조건 하나의 택배상자는 실을 수 있기 때문)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <string>
#include <vector>
 
using namespace std;
 
int solution(vector<int> order) {
    int answer = 1;
    
    vector<int> sub;
    vector<int> main;   // 3 1 2 5 4
    
    int start = order[0];
    
    for (int i=order.size();i>=1;i--)
    {
        main.push_back(i);  
    }
    
    for (int i=1;i<start;i++)
    {
        sub.push_back(i);
        main.pop_back();
    }
    
    int idx = 1;
    main.pop_back();
    
    //다시 왔다갔다 하는 과정이 안들어있음.
    // main   2 3 4 5
    // sub   
    // box 1 3 
    while(true)
    {        
        int cur = order[idx];
        bool flag = false;
        
        if (main.size() != 0 && cur == main[main.size()-1])
        {
            answer++;
            idx++;
            flag = true;
            main.pop_back();
            continue;
        }
        
        if (sub.size() != 0 && cur == sub[sub.size()-1])
        {
            answer++;
            idx++;
            flag = true;
            sub.pop_back();
            continue;
        }
        
        if (main.size() != 0  && cur != main[main.size()-1])
        {
            int tmp = main[main.size()-1];
            main.pop_back();
            sub.push_back(tmp);
            continue;
        }
        
        if (flag==false)
            break;
    }
    
    
    return answer;
}
cs
Comments