티스토리 뷰

PS

BOJ 11866 요세푸스 문제 0

짜비 2020. 4. 5. 23:23

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

 

11866번: 요세푸스 문제 0

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)

www.acmicpc.net

 

 

0. 문제 개요

N과 K값이 주어진다. N은 사람의 수, K는 죽는 순서이다. N명의 사람이 둥글게 앉는다. K번째 사람이 한 명씩 죽는다. 이때 죽은 사람은 K번째 숫자를 셀 때 포함시키지 않는다.

 

 

 

 

1. 문제 해결 아이디어

종만북의 풀이를 참고했다.

Vector를 이용해서 풀 수도 있지만 Queue를 이용해보자.

먼저 일반적인 queue는 일직선 형태이기 때문에 이를 원형 큐처럼 이용할 수 있는 방법을 생각해야 한다.

 

다음 원형 큐를 탐색하는 순서는 다음과 같다. 1 - 2 - 3 - 4 - 1 - 2 - 3 - 4 - ...

즉, 맨 앞에서 조사받은 숫자가 맨 뒤로 이동한다. 이를 일직선으로 나타내 보면, 다음과 같이 나타낼 수 있다.

 

 

 

 

조사를 받은 1이 맨 뒤로 이동한다.

 

이를 queue로 구현하면, 맨 앞 숫자를 꺼냈다가(pop) 그것이 빼내 지지 않는다면(k번째 사람이 아니라면)

다시 맨뒤로 push하면 된다.

 

 

2. 코드

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
32
33
34
35
36
37
38
39
#include <iostream>
#include <queue>
using namespace std;
queue<int> q;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    int n, k;
    cin >> n >> k;
    
    for (int i = 1;i <= n;i++) {        //순서대로 queue에 넣는다.
        q.push(i);
    }
    int turn = 1, cur, cnt = 0;            //cur : 현재 탐색받는 사람
    while (!q.empty()) {                //cnt : 출력 형식을 맞춰주기 위한 카운터
        cur = q.front();                //맨 앞의 사람을 queue에서 꺼내 탐색한다.
        q.pop();                        
        if (turn % k == 0) {            //k번째 사람이면
            cnt++;                          
            if (cnt == 1) {
                cout << '<';
            }
            cout << cur;                //이번에 죽은 사람을 출력한다.
            if (cnt == n) {
                cout << '>';
            }
            else {
                cout << ", ";
            }
        }
        else {                           //k번째 사람이 아니면
            q.push(cur);                //다시 queue의 맨 뒤로 넣어 준다.
        }
        turn++;    
    }
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

 

 

3. 나가며...

vector.erase()를 이용하면 해당 자리까지 깔끔하게 지워지기 때문에 vector로 구현하는 것도

그렇게 복잡하지는 않다.

 

 

 

'PS' 카테고리의 다른 글

기둥과 보 설치 (C++) 2020 KAKAO BLIND RECRUITMENT  (0) 2020.08.18
PROGRAMMERS 캐시 (2018 KAKAO BLIND RECRUITMENT)  (0) 2020.05.11
BOJ 2629 양팔저울  (0) 2020.04.03
BOJ 2210 숫자판 점프  (0) 2020.03.26
BOJ 14891 톱니바퀴  (0) 2020.03.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/10   »
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
글 보관함