2022. 10. 27. 22:12ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/2161
2161번: 카드1
N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가
www.acmicpc.net

접근 방법 - 큐를 이용한 연산 문제
백준의 2161번 문제는 큐를 이용한 연산을 통해 해결해야 하는 문제이다.
해당 문제는, 특정 규칙에 따라 카드 위치를 변경하면서 버려지는 카드 번호를 순차적으로 출력해야 하는 문제이다.
이때 카드 위치를 변경하는 규칙은 아래와 같다.
1. 제일 위에 있는 카드를 버린다.
2. 그다음, 위에 있는 카드를 제일 아래로 옮긴다.
(이 순서를 반복한다.)
이때, 규칙을 살펴보면 역방향이 아닌 정방향으로 카드의 순서가 변경되고 있는 것을 확인할 수 있다.
따라서, 필자는 이 문제에선 스택보다는 큐를 사용하는 것이 더 적합하다고 판단하였다.
큐와 관련된 문제의 풀이는 아래 링크에 있으니, 큐에 대하여 처음 접해본다면 꼭 참고해보길 바란다.
(사실 큐에 대한 자체적인 설명은 없고 큐 라이브러리 함수들을 사용하는 것만 기재되어있으니 양해 바란다.)
https://smary-it.tistory.com/79
[백준 BOJ] 10845번 큐 (C++/cpp)
문제 설명 https://www.acmicpc.net/problem/10845 10845번: 큐 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거..
smary-it.tistory.com
혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 카드의 개수(n)를 입력받는다.
2) 1부터 n번까지의 카드 순서를 저장할 int형 큐(q)를 선언해둔다.
3) 반복문을 통해, 1부터 n번까지 순차적으로 q에 push한다.
4) q가 빌 때까지, 반복문을 통해 아래의 연산을 취한다.
- 우선 가장 위에 있는 카드를 버려야 한다. 따라서, front에 있는 값을 출력한 뒤 이에 대하여 pop 연산을 취한다.
(만일 이 연산을 취한 직후 q 안에 아무런 값도 없다면, 즉시 반복문을 탈출하도록 한다.)
- 다음으로, 위에 있는 카드를 아래로 옮겨야 한다. 따라서, front에 있는 값을 q에 push한 뒤, 현재 front에 대해 pop 연산을 취한다.
5) 모든 연산이 완료되었다면, 실행 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <queue>
#define endl '\n'
using namespace std;
//백준 2161번 코드
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int n;
cin >> n;
queue<int> q;
for (int i = 1; i <= n; i++) {
q.push(i);
}
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
if (q.empty()) { break; }
q.push(q.front());
q.pop();
}
}
제출 결과

(2022.08.29 백준 2161번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 17295번 엔드게임 스포일러 (C++/cpp) (0) | 2022.10.31 |
---|---|
[백준 BOJ] 5532번 방학 숙제 (C++/cpp) (1) | 2022.10.31 |
[백준 BOJ] 1312번 소수 (C++/cpp) (0) | 2022.10.27 |
[백준 BOJ] 9655번 돌 게임 (C++/cpp) (0) | 2022.10.27 |
[백준 BOJ] 3273번 두 수의 합 (C++/cpp) (0) | 2022.10.26 |