πŸ• Baaaaaarking/0x07κ°• - 덱

[BOJ S4][C++] 1021번: νšŒμ „ν•˜λŠ” 큐

선달 2022. 2. 21. 17:52
λ°˜μ‘ν˜•

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

 

1021번: νšŒμ „ν•˜λŠ” 큐

첫째 쀄에 큐의 크기 Nκ³Ό 뽑아내렀고 ν•˜λŠ” 수의 개수 M이 주어진닀. N은 50보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , M은 N보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 지민이가 뽑아내렀고 ν•˜λŠ” 수의 μœ„μΉ˜κ°€

www.acmicpc.net

 

문제

μ§€λ―Όμ΄λŠ” N개의 μ›μ†Œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” μ–‘λ°©ν–₯ μˆœν™˜ 큐λ₯Ό 가지고 μžˆλ‹€. μ§€λ―Όμ΄λŠ” 이 νμ—μ„œ λͺ‡ 개의 μ›μ†Œλ₯Ό 뽑아내렀고 ν•œλ‹€.

μ§€λ―Όμ΄λŠ” 이 νμ—μ„œ λ‹€μŒκ³Ό 같은 3가지 연산을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

  1. 첫 번째 μ›μ†Œλ₯Ό 뽑아낸닀. 이 연산을 μˆ˜ν–‰ν•˜λ©΄, μ›λž˜ 큐의 μ›μ†Œκ°€ a1, ..., akμ΄μ—ˆλ˜ 것이 a2, ..., ak와 같이 λœλ‹€.
  2. μ™Όμͺ½μœΌλ‘œ ν•œ μΉΈ μ΄λ™μ‹œν‚¨λ‹€. 이 연산을 μˆ˜ν–‰ν•˜λ©΄, a1, ..., akκ°€ a2, ..., ak, a1이 λœλ‹€.
  3. 였λ₯Έμͺ½μœΌλ‘œ ν•œ μΉΈ μ΄λ™μ‹œν‚¨λ‹€. 이 연산을 μˆ˜ν–‰ν•˜λ©΄, a1, ..., akκ°€ ak, a1, ..., ak-1이 λœλ‹€.

큐에 μ²˜μŒμ— ν¬ν•¨λ˜μ–΄ 있던 수 N이 주어진닀. 그리고 지민이가 뽑아내렀고 ν•˜λŠ” μ›μ†Œμ˜ μœ„μΉ˜κ°€ 주어진닀. (이 μœ„μΉ˜λŠ” κ°€μž₯ 처음 νμ—μ„œμ˜ μœ„μΉ˜μ΄λ‹€.) μ΄λ•Œ, κ·Έ μ›μ†Œλ₯Ό 주어진 μˆœμ„œλŒ€λ‘œ λ½‘μ•„λ‚΄λŠ”λ° λ“œλŠ” 2번, 3번 μ—°μ‚°μ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 큐의 크기 Nκ³Ό 뽑아내렀고 ν•˜λŠ” 수의 개수 M이 주어진닀. N은 50보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , M은 N보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 지민이가 뽑아내렀고 ν•˜λŠ” 수의 μœ„μΉ˜κ°€ μˆœμ„œλŒ€λ‘œ 주어진닀. μœ„μΉ˜λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , N보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 문제의 정닡을 좜λ ₯ν•œλ‹€.

 

풀이

큐의 νšŒμ „μ€

끝에 μžˆλŠ” μ›μ†Œμ™€ 같은 값을 λ‹€λ₯Έλ°©ν–₯ 끝에 pushν•˜κ³ 

μ›λž˜ 있던 μ›μ†ŒλŠ” pop ν•˜λŠ” λ°©μ‹μœΌλ‘œ  μ‰½κ²Œ κ΅¬ν˜„ κ°€λŠ₯ν•˜λ‹€.

q.push(q.start());
q.pop();

 

λ‹€λ§Œ 이 문제의 ν¬μΈνŠΈλŠ” λ°©ν–₯이 μ™Όμͺ½κ³Ό 였λ₯Έμͺ½ λ‘κ°œλΌλŠ” 점이닀. 

λ”°λΌμ„œ μ•žμͺ½ λ’€μͺ½ 상관없이 μ–‘μͺ½μœΌλ‘œ pop push 연산이 κ°€λŠ₯ν•œ 덱(depue)λ₯Ό μ΄μš©ν•΄μ•Όν•œλ‹€.

// μ™Όμͺ½ νšŒμ „
d.push_front(d.back());
d.pop_back();

// 였λ₯Έμͺ½ νšŒμ „
d.push_back(d.front());
d.pop_front();

 

이제 각 κ²½μš°μ— 따라

연산을 μ΅œμ†Œν™” ν•  수 μžˆλŠ” νšŒμ „ λ°©ν–₯을 κ΅¬ν•˜κ³ 

ν•΄λ‹Ή λ°©ν–₯으둜 νšŒμ „λ§Œ ν•˜λ©΄ λœλ‹€.

 

μ΄λ•Œ νšŒμ „ 후에도 μ›λž˜μ˜ 자리λ₯Ό μ•Œ 수 μžˆλ„λ‘

μ—°μ‚° μ‹œμž‘μ „ 덱에 μœ„μΉ˜λ₯Ό κ°’μœΌλ‘œ κ°€μ§€λŠ” μ›μ†Œλ“€μ„ μˆœμ„œμ— 맞게 λ„£μ–΄λ‘μ—ˆλ‹€

 

이제 for문으둜 ν›‘μ–΄λ³΄λ©΄μ„œ (μ§€κΈˆ λ³΄λ‹ˆ findμ΄μš©ν•΄μ„œ μ•„μ˜ˆ 인덱슀λ₯Ό κ΅¬ν•˜λ©΄ 더 νŽΈν–ˆμ„ν…λ°)

(덱은 νλ‚˜ μŠ€νƒκ³Ό 달리 각 μ›μ†Œμ— iteratorλ₯Ό μ΄μš©ν•œ 접근이 κ°€λŠ₯ν•˜λ‹€ ex. d[i])

ν•΄λ‹Ή 값이 끝과 μ‹œμž‘μ€‘ 어디와 더 κ°€κΉŒμš΄μ§€ μΉ΄μš΄νŠΈν•΄μ„œ 였λ₯Έμͺ½ μ™Όμͺ½ λ°©ν–₯을 μ •ν•˜λ©΄ λœλ‹€

 

단, μ΄λ•Œ μ£Όμ˜ν• μ 

μ™Όμͺ½μ€ μ‹œμž‘λΆ€ν„° μΉ΄μš΄νŠΈν•˜κΈ° λ•Œλ¬Έμ— μ΄ˆκΉƒκ°’μ΄ 0μ΄μ§€λ§Œ

였λ₯Έμͺ½μ€ λμ—μ„œλΆ€ν„° μΉ΄μš΄νŠΈν•˜κΈ° λ•Œλ¬Έμ— μ΄ˆκΉƒκ°’μ΄ 1이닀

(μ‹œμž‘μ—μ„œ 맨끝으둜 κ°€λŠ” 연산이 ν•œλ²ˆμ΄ μΆ”κ°€λ˜μ–΄μžˆμ–΄μ•Ό 함)

 

// Authored by : seondal
// Co-authored by : -

//#include <bits/stdc++.h>
#include <iostream>
#include <deque>

using namespace std;

int ans, n, m;
deque<int> d;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    // μžλ¦¬μ— ν•΄λ‹Ήν•˜λŠ” μ›μ†Œ 넣어놓기
    cin >> n >> m;
    for(int i=1; i<=n; i++) d.push_back(i);
    
    while(m--){
        
        // μž…λ ₯
        int e;
        cin >> e;
        
        // 더 κ°€κΉŒμš΄ λ°©ν–₯ κ³ λ₯΄κΈ°
        int right=1, left=0;
        for(int i=0; true; i++){
            if(d[i] == e) break;
            left++;
        }
        for(int i=d.size()-1; true; i--){
            if(d[i] == e) break;
            right++;
        }
        
        // λ°©ν–₯에 맞게 돌리기
        if(right < left){
            for(int i=0; i<right; i++){
                d.push_front(d.back());
                d.pop_back();
            }
            ans += right;
        } else {
            for(int i=0; i<left; i++){
                d.push_back(d.front());
                d.pop_front();
            }
            ans += left;
        }
        
        d.pop_front();
    }
    
    cout << ans;
    
    return 0;
}

/*
 */
λ°˜μ‘ν˜•

'πŸ• Baaaaaarking > 0x07κ°• - 덱' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ P5][C++] 11003번: μ΅œμ†Ÿκ°’ μ°ΎκΈ°  (0) 2022.02.25
[BOJ G5][C++] λ°±μ€€ 5430번: AC  (0) 2022.02.23