https://www.acmicpc.net/problem/1021
문제
큐의 크기 N(1<=N<=50)과 뽑아내려고 하는 수의 개수 M(1<=M<=N)이 주어진다.뽑아내려고 하는 수의 위치가 순서대로 주어진다. 큐의 첫 번째 원소를 뽑아내거나, 큐를 왼쪽으로 회전시키거나, 오른쪽으로 회전시키는 행동을 할 수 있을 때 모든 수를 뽑아내기 위해 최소 몇 번의 회전이 필요한지 출력한다.
풀이
리스트로 iter값 이동시키며, 직접 수를 뽑아낸다. 이때 인덱스 처리 순서와 반환 값에 주의한다.
#include <iostream>
#include <list>
using namespace std;
int n, m, x, cnt = 0;
list<int>l;
list<int>::iterator iter;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
l.push_back(i);
}
iter = l.begin();
for (int i = 0; i < m; i++) {
cin >> x;
if (l.size() == 1) break;
list<int>::iterator iterL = iter;
int cntL = 0;
while (*iterL != x) {
if (iterL == l.begin()) iterL = l.end();
iterL--;
cntL++;
}
list<int>::iterator iterR = iter;
int cntR = 0;
while (*iterR != x) {
iterR++;
cntR++;
if (iterR == l.end()) iterR = l.begin();
}
cnt += min(cntR, cntL);
iter = l.erase(iterR);
if (iter == l.end()) iter = l.begin();
}
cout << cnt;
}
'Koala - 15기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/Python] #27496 발머의 피크 이론 (0) | 2024.07.25 |
---|---|
[백준/c++] 1874번: 스택 수열 (0) | 2024.07.23 |
[백준/Python3] 14465번 : 소가 길을 건너간 이유 5 (0) | 2024.07.21 |
[백준/Java]-먹을 것인가 먹힐 것인가 (0) | 2024.07.21 |
[백준/C++] 1806번: 부분합 (0) | 2024.07.21 |