일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 기초
- 3월
- 유니티 심화과정
- 단계별로 풀어보기
- 다이나믹 프로그래밍
- 5월
- 2024년
- 개인 프로젝트
- 4월
- todolist
- 1월
- 골드메탈
- 수학
- 프로그래머스
- 7월
- 2023년
- 개인 프로젝트 - 런앤건
- 코딩 테스트
- C/C++
- 유니티
- 2025년
- c++
- 자료 구조
- 6월
- 2월
- 백준
- 입문
- 2022년
- 게임 엔진 공부
- 코딩 기초 트레이닝
- Today
- Total
기록 보관소
[Baekjoon/백준] 1021번: 회전하는 큐(C/C++) 본문
단계별로 풀어보기 19단계(큐, 덱) 6번 문제
https://www.acmicpc.net/step/12
큐, 덱 단계
덱의 개념을 익히고 실습하는 문제. (입력 크기가 너무 작아서 비효율적인 구현으로도 통과가 되지만, 가급적이면 연산 당 시간 복잡도가 O(1)이도록 구현해 주세요.)
www.acmicpc.net
백준 1021번: 회전하는 큐
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
문제 설명
지민이는 N개의 원소를 포함하고 있는 양방향 순환 큐를 가지고 있다. 지민이는 이 큐에서 몇 개의 원소를 뽑아내려고 한다.
지민이는 이 큐에서 다음과 같은 3가지 연산을 수행할 수 있다.
- 첫 번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak와 같이 된다.
- 왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 a2, ..., ak, a1이 된다.
- 오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 ak, a1, ..., ak-1이 된다.
큐에 처음에 포함되어 있던 수 N이 주어진다. 그리고 지민이가 뽑아내려고 하는 원소의 위치가 주어진다. (이 위치는 가장 처음 큐에서의 위치이다.) 이때, 그 원소를 주어진 순서대로 뽑아내는데 드는 2번, 3번 연산의 최솟값을 출력하는 프로그램을 작성하시오.
입력과 출력
입력: 첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 순서대로 주어진다. 위치는 1보다 크거나 같고, N보다 작거나 같은 자연수이다.
출력: 첫째 줄에 문제의 정답을 출력한다.
접근 방법
이번 문제는 큐의 크기 N과 찾을 개수 M을 입력받고, 이후 M개의 찾을 숫자의 위치를 입력받아 해당 숫자를 찾는데 필요한 2번 혹은 3번 연산의 최소 횟수를 구하는 문제다.
처음에 문제를 이해하는게 어려워서 코딩 보다는 이해하는데 조금 걸렸던 문제였던 것 같다. 이번 문제 풀이는 그냥 간단하게 말해서 찾을 원소의 위치에 따라 덱의 front에서부터 찾는 것이 빠를지 아니면 back에서부터 찾는 것이 빠를지 알아내서 그 횟수를 누적해 출력하면 된다.
덱의 front에 가까운지 back에 가까운지 찾는것은 그냥 반복문을 돌면서 찾으려는 숫자 위치와 일치하는 값을 찾으면, front는 반복 횟수만큼, back은 큐의 크기에서 반복 횟수만큼 뺀 것으로 계산하면 된다.
추가로 주의할 점은 back에서부터 찾는 것은 front와는 다르게 반드시 3번 연산을 한번 하고 1번 연산(첫번째 원소 출력)을 해야하므로 연산 횟수가 front보다 1번 더 많아서, front와 back부터 찾는 거리가 같다면 front로 하는 것이 정답이다.
코드
#include <iostream>
#include <deque>
using namespace std;
deque <int> dq;
int main(int argc, char *argv[]) {
int N, M, findNum, dqFront, dqBack, count = 0;
cin >> N >> M;
for (int i = 1; i <= N; i++)
dq.push_back(i);
while (M--) {
cin >> findNum;
for (int i = 0; i < dq.size(); i++) //더 가까운 위치 찾기
if (dq[i] == findNum) {
dqFront = i;
dqBack = dq.size() - i;
}
if (dqFront <= dqBack) { //앞에서부터 찾는 것이 가까울 경우
while (1) { //2번 연산 반복
if (dq.front() == findNum)
break;
dq.push_back(dq.front());
dq.pop_front();
count++;
}
dq.pop_front(); //1번 연산
}
else { //뒤에서부터 찾는 것이 가까울 경우
count++; //뒤에서부터 찾으면 3번 연산을 1번 해야하므로 count 증가
while (1) { //3번 연산 반복
if (dq.back() == findNum)
break;
dq.push_front(dq.back());
dq.pop_back();
count++;
}
dq.pop_back(); //1번 연산
}
}
cout << count << endl;
return 0;
}
결과
'코딩 테스트 > 백준' 카테고리의 다른 글
[Baekjoon/백준] 2630번: 색종이 만들기(C/C++) (0) | 2022.04.24 |
---|---|
[Baekjoon/백준] 5430번: AC(C/C++) (0) | 2022.04.23 |
[Baekjoon/백준] 10866번: 덱(C/C++) (0) | 2022.04.17 |
[Baekjoon/백준] 1966번: 프린터 큐(C/C++) (0) | 2022.04.16 |
[Baekjoon/백준] 11866번: 요세푸스 문제 0(C/C++) (0) | 2022.04.15 |