#문제

https://www.acmicpc.net/problem/1021

 

1021번: 회전하는 큐

첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 순서대로 주어진다. 위치는 1보다 크거나 같고, N보다 작거나 같은 자연수이다.

www.acmicpc.net

 

#작성 코드

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
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <deque>
using namespace std;
 
int n, m;
deque<int> dq;
int count=0;
 
void pop(){
    dq.pop_front();
}
void right(){
    // 우측 순환 회전 <<-
    dq.push_back(dq.front());
    dq.pop_front();
    count++;
}
void left(){
    // 좌측 순환 회전 ->>
    dq.push_front(dq.back());
    dq.pop_back();
    count++;
}
 
int main(){
    cin>>n>>m;
    
    for(int i=1; i<=n; i++)
        dq.push_back(i);
    
    for(int i=0; i<m; i++){
        int num;
        cin>>num;
        
        // 바로 front에서 num을 뽑아낼 수 있다면 뽑아낸다. 
        if( dq.front()==num ){
            pop();
            continue;
        }
        
        int idx=0;
        // 지금 입력받은 num이 dq의 몇 번째에 위치하는지 찾는다.
        for(int i=0; i<dq.size(); i++){
            if( dq[i]==num){
                idx=i;
                break;
            }
        }
        
        // 좌측으로 회전시키는것, 우측으로 회전시키는 것 중
        // 어느 쪽이 더 빠른지 계산
        if( idx <= dq.size()-idx ){
            // 앞에서부터 세는 것이 빠른 경우
            // 우측 순환 회전 시키며 front 같을 때까지 찾는다. 
            while(true){
                right(); 
                if( dq.front()==num ){
                    pop();
                    break;
                }
            }
        }
        else{
            // 뒤에서부터 세는 것이 빠른 경우
            // 좌측 순환 회전 시키며 front 같을 때까지 찾는다. 
            while(true){
                left();
                if( dq.front()==num){
                    pop();
                    break;
                }
            }
        }
    }
    cout<<count<<'\n';
    return 0;
    
}
cs

##

큐는 임의의 위치에 존재하는 값을 참조할 수 없지만, 덱은 벡터처럼 임의의 위치에 존재하는 값을 참조할 수 있다.

-> 덱을 사용한다!

 

'BOJ' 카테고리의 다른 글

BOJ 11066번 :: 파일 합치기  (0) 2020.01.04
BOJ 6549번 :: 히스토그램에서 가장 큰 직사각형  (0) 2020.01.04
BOJ 1300번 :: K번째 수  (0) 2020.01.03
BOJ 2293번 :: 동전 1  (0) 2020.01.02
BOJ 2110번 :: 공유기 설치  (0) 2019.12.31

+ Recent posts