문제
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
문제 요약
N개의 원소를 포함하고 있는 양방향 순환 큐가 있을 때, 세 가지 연산을 할 수 있다.
1. 첫 번째 원소를 뽑아낸다.
2. 왼쪽으로 한 칸씩 이동시킨다.
3. 오른쪽으로 한 칸씩 이동시킨다.
지민이가 뽑아내려고 하는 원소의 위치가 주어졌을 때, 뽑아내는데 드는 2, 3번 연산의 최솟값을 출력한다.
코드
#include <iostream>
#include <deque>
using namespace std;
deque<int> dq;
int n, m, cnt;
// num 원소가 dq에 현재 몇번째 위치에 있는지 반환
int searchIndex(int num) {
for (int i = 0; i < dq.size(); i++) {
if (dq[i] == num) {
return i;
}
}
return -1;
}
// 2번 연산 : 왼쪽 이동
void goLeft() {
int num = dq[0];
dq.pop_front();
dq.push_back(num);
}
// 3번 연산 : 오른쪽 이동
void goRight() {
int num = dq[dq.size() - 1];
dq.pop_back();
dq.push_front(num);
}
int main() {
cin >> n >> m;
// 원소들의 초기 위치를 저장하는 각 원소들을 deque에 저장
for (int i = 1; i <= n; i++) {
dq.push_back(i);
}
for (int i = 0; i < m; i++) {
int num;
cin >> num;
// 현재 해당 원소의 위치 탐색
int idx = searchIndex(num);
if (idx == 0) {
dq.pop_front();
continue;
}
else if (idx <= dq.size() / 2) {
while (dq[0] != num) {
goLeft();
cnt++;
}
dq.pop_front();
}
else {
while (dq[0] != num) {
goRight();
cnt++;
}
dq.pop_front();
}
}
cout << cnt;
return 0;
}
코드 설명
원소를 왼쪽, 오른쪽에서 모두 삽입/삭제가 가능한 Deque라는 자료구조를 이용한다.
먼저 Deque에 원소들의 초기 위치 정보를 순서대로 저장한다.
왼쪽에서 삭제를 해야할 원소를 입력 받을 때마다, Deque에서 해당 원소의 위치를 찾는다.
그 위치가 현재 Deque의 크기의 절반보다 작으면 왼쪽에서, 크면 오른쪽에서 삭제한다.
삭제를 위해 반복문을 돌며 원소가 Deque의 왼쪽 끝에 올 때까지 전체 원소를 이동시킨다.
마지막으로 전체 원소를 이동시킨 횟수를 출력한다.
'Algorithm Problems > 자료구조' 카테고리의 다른 글
[백준/C++] 25603번: 짱해커 이동식 (1) | 2024.07.25 |
---|---|
[백준/C++] 11866번: 요세푸스 문제 0 (0) | 2024.05.11 |
[프로그래머스/C++] 뒤에 있는 큰 수 찾기 (0) | 2024.02.27 |
[백준/python] 1417번: 국회의원 선거 (2) | 2023.08.24 |
[백준/python] 1927번, 11279번, 11286번: 최소, 최대, 절댓값 힙 (2) | 2023.08.24 |