https://www.acmicpc.net/problem/1158

[필자 사고]
간단한 큐를 이용하는 문제다.
문제에서 주어진 K수만큼 큐에서 뽑고 다시 넣는걸 반복하면 쉽게 문제를 해결할 수 있따.
아래는 자세한 코드해설이다.
[코드 해설]
main 함수
- 프로그램의 시작점입니다.
- 입력으로 N(사람 수)와 K(제거할 순서)를 받습니다.
queue 자료구조 초기화
- queue<int> myQueue;
- 1번부터 N번까지 사람을 차례로 큐에 넣습니다 (myQueue.push(i)).
제거 과정 반복 (while (!myQueue.empty()))
- 큐가 빌 때까지 계속 실행합니다.
- 안쪽에서 for문을 이용해 K번 반복하며 사람을 순서대로 뽑아옵니다 (myQueue.front(), myQueue.pop()).
제거 로직 (for (int i = 0; i < K; i++))
- i == K-1일 때 → K번째 사람에 해당하므로 resultNums 벡터에 추가합니다. (즉, 제거된 사람 기록)
- 그렇지 않으면 → 다시 큐의 뒤로 넣습니다 (myQueue.push(nowNum)).
결과 출력
- 모든 사람이 제거된 순서를 resultNums 벡터에 저장해 둔 뒤 출력합니다.
- 출력 형식은 <a, b, c, ...> 형태로 맞춰집니다.
- 마지막 원소는 뒤에 , 없이 출력하도록 조건문 처리했습니다.
[소스 코드]
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int N, K;
int main(void) {
cin >> N >> K;
queue<int> myQueue;
for (int i = 1; i <= N; i++) {
myQueue.push(i);
}
vector<int> resultNums;
while (!myQueue.empty()) {
for (int i = 0; i < K; i++) {
int nowNum = myQueue.front();
myQueue.pop();
if (i == K - 1) {
resultNums.push_back(nowNum);
}
else {
myQueue.push(nowNum);
}
}
}
cout << "<";
for (int i = 0; i < resultNums.size(); i++) {
if (i == resultNums.size() - 1) {
cout << resultNums[i];
break;
}
cout << resultNums[i] << ", ";
}
cout << ">";
}'백준 > 자료구조' 카테고리의 다른 글
| 백준 28278 c++ "스택 2" -PlusUltraCode- (0) | 2025.09.17 |
|---|---|
| 백준 1269 c++ "대칭 차집합" -PlusUltraCode- (0) | 2025.09.17 |
| 백준 10815 c++ "숫자 카드" -PlusUltraCode- (0) | 2025.09.14 |
| 백준 1427 c++ "소트인사" -PlusUltraCode- (0) | 2025.09.14 |
| 백준 1406 c++ "에디터" -PlusUltraCode- (0) | 2025.05.27 |