Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 티스토리챌린지
- 알고리즘
- C++
- Set
- 그래프
- 유클리드호제법
- 백준
- 깊이우선탐색
- 우선순위큐
- 이분탐색
- vector
- 최소공배수
- BFS
- 백트래킹
- int
- map
- 프로그래머스
- priority_queue
- 오블완
- DP
- N과M
- 정렬
- 다이나믹프로그래밍
- 에라토스테네스의 체
- DFS
- stoi
- 문자열
- 배열
- 분할정복
- Sort
Archives
- Today
- Total
안녕 세상아,
[c++/백준] 1021 회전하는 큐 본문
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
큐의 양쪽에서 삽입 삭제가 이루어지기 때문에 deque를 사용해야한다.
deque를 사용해야하는 것은 쉽게 알 수 있다.
dq 크기의 반 이하인지, 이상인지 구해야하지만 괜히 복잡하게 생각해서 함수 두개 따로 만들어서 min값 받으려고 했다.
하다보니까 뭔가 이상하고 잘 안돼서 노선 바꿈..물론 이런 방법으로도 풀 수 있겠지만 푸는 사람이 많이 없는 이유가 있겠지..?
암튼 정답 코드는 입력받은 x값이 dq 크기의 반 이하인지 이상인지 알아내서 case 분류하면 된다.
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> dq;
int n, m;
int cnt = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
dq.push_back(i);
}
int index = 0;
while (m--)
{
int x;
cin >> x;
for (int i = 0; i < dq.size(); i++) {
if (dq[i] == x) {
index = i;
break;
}
}
if (index < dq.size()/2 +1) { // 2번 실행
while (1) {
if (dq.front() == x) {
dq.pop_front();
break;
}
dq.push_back(dq.front());
dq.pop_front();
cnt++;
}
}
else
{ //3번 실행
while (1) {
if (dq.front() == x) {
dq.pop_front();
break;
}
dq.push_front(dq.back());
dq.pop_back();
cnt++;
}
}
}
cout << cnt;
return 0;
}
또한 나는 문제 잘못 읽어서 "뽑아내려고 하는 원소의 위치가 주어진다. (이 위치는 가장 처음 큐에서의 위치이다.)" 굉장히 헛다리 짚었다.
to me..
문제 잘읽기...^^
'백준' 카테고리의 다른 글
[c++/백준] 13305 주유소 (0) | 2023.05.10 |
---|---|
[c++/백준] 15651 N과 M (3) (1) | 2023.05.10 |
[c++/백준] 11659 구간 합 구하기 4 (1) | 2023.05.09 |
[c++/백준] 2108 통계학 (1) | 2023.05.08 |
[c++/백준] 14501 퇴사 (0) | 2023.05.08 |