| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- dropout
- 조합론
- 백트래킹
- 이분 탐색
- 우선 순위 큐
- pytorch
- 자바스크립트
- 2023
- 플로이드 와샬
- 알고리즘
- 문자열
- 가끔은_말로
- 미래는_현재와_과거로
- BFS
- lazy propagation
- 다익스트라
- 분할 정복
- c++
- back propagation
- 크루스칼
- dfs
- object detection
- Overfitting
- 가끔은 말로
- 세그먼트 트리
- 회고록
- NEXT
- 너비 우선 탐색
- DP
- tensorflow
Archives
- Today
- Total
Doby's Lab
백준 20301번: 반전 요세푸스 (C++) 본문
https://www.acmicpc.net/problem/20301
20301번: 반전 요세푸스
첫째 줄에 정수 $N$, $K$, $M$이 주어진다. ($1 \leq N \leq 5\ 000$, $1 \leq K, M \leq N$)
www.acmicpc.net
Solved By: Deque
뺀 사람의 수가 M명이 되었을 경우, 방향을 바꿔야 하기 때문에 큐가 아닌 덱을 사용하여 양방향을 고려하게 해주고,
M명이 되었을 때 bool type flag변수를 사용하여 방향을 바꿀지 말지에 대한 여부를 설정해줬습니다.
#include <iostream>
#include <deque>
using namespace std;
int main(){
ios_base::sync_with_stdii(false);
cin.tie(NULL);
int n, k, m; cin >> n >> k >> m;
deque<int> dq;
for(int i = 1; i <= n; i++){
dq.push_back(i);
}
int mcnt = 0;
bool flag = 0;
while(!dq.empty()){ // 모든 수 사용 == 덱 안에 있는 모든 수 사용
int kcnt = 0; // k번쨰 사람
if(mcnt == m){
flag = (flag == 0) ? 1 : 0;
mcnt = 0;
}
if(!flag){ // right direction
while(true){
int tmp = dq.front();
dq.pop_front();
dq.push_back(tmp);
++kcnt; // 덱으로 돌리면서 몇 번째인지 cnt
if(kcnt == k){// k번째 사람을 찾은 경우
dq.pop_back();
++mcnt;// 1명 뺐으니 mcnt++
cout << tmp << '\n';
break;
}
}
}
else{ // left direction
while(true){
int tmp = dq.back();
dq.pop_back();
dq.push_front(tmp);
++kcnt;
if(kcnt == k){
dq.pop_front();
++mcnt;
cout << tmp << '\n';
break;
}
}
}
}
}
'PS > BOJ' 카테고리의 다른 글
| 백준 1535번: 안녕 (C++) (0) | 2022.06.29 |
|---|---|
| 백준 12865번: 평범한 배낭 (C++) (0) | 2022.06.29 |
| 백준 24262번: 알고리즘 수업 - 알고리즘의 수행 시간 1 (C++) (0) | 2022.06.26 |
| 백준 13905번: 세부 (C++) (0) | 2022.06.26 |
| 백준 2042번: 구간 합 구하기 (C++) (0) | 2022.06.25 |
