-
Baekjoon_1158_요세푸스 문제Algorithm/_Baekjoon 2023. 5. 24. 17:29
문제주소: https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
요세푸스 문제에 대한 설명이 문제에도 있지만, 다음 링크를 보시면 조금 더 이해하기 쉬울 수 있습니다.
요세푸스: https://ko.wikipedia.org/wiki/%EC%9A%94%EC%84%B8%ED%91%B8%EC%8A%A4_%EB%AC%B8%EC%A0%9C
요세푸스 문제 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 전산학이나 수학에서 요세푸스 문제(Josephus problem) 혹은 요세푸스 순열(Josephus permutation)은 다음과 같이 정의한다. n과 k가 자연수이고, k < n이라고 가정한다. n명
ko.wikipedia.org
이를 해결하기 위해 queue를 사용하였으며, 입력한 순서가 될 때까지 앞쪽 번호를 뒤쪽으로 옮기고 입력한 순서가 된다면, 빈 list에 담도록 하였습니다.
init_list: [1, 2, 3, 4, 5, 6, 7], answer: []
- init_list: [1, 2, 3, 4, 5, 6, 7], answer: [] → init_list: [2, 3, 4, 5, 6, 7, 1], answer: []
- init_list: [2, 3, 4, 5, 6, 7, 1], answer: [] → init_list: [3, 4, 5, 6, 7, 1, 2], answer: []
- init_list: [3, 4, 5, 6, 7, 1, 2], answer: [] → init_list: [4, 5, 6, 7, 1, 2], answer: [3]
코드는 다음과 같습니다.
Python
import sys from collections import deque def main(): max_num, rep_num = sys.stdin.readline().split(' ') max_num: int = int(max_num) rep_num: int = int(rep_num) my_queue: deque[int] = deque() my_answer: list[int] = [] check_num: int = 1 # make my_queue for i in range(max_num): my_queue.append(i+1) # Josephus while(my_queue): if (check_num%rep_num == 0): my_answer.append(my_queue.popleft()) check_num = 0 else: my_queue.append(my_queue.popleft()) check_num += 1 total_answer = "<"+', '.join(str(number) for number in my_answer)+">" print(total_answer) if __name__ == "__main__": main()
C++
#include <iostream> #include <queue> #include <vector> using namespace std; int main() { ios::sync_with_stdio; cin.tie(), cout.tie(); int last_num, repeat_num; int check_num = 1; int first_num; // input cin >> last_num >> repeat_num; queue<int> my_que; vector<int> answer; // queue는 index 탐색이 안되기 때문에 vector 사용 for (int i=1; i<=last_num; i++) my_que.push(i); while(!my_que.empty()) { if (check_num%repeat_num == 0) { first_num = my_que.front(); // first num return my_que.pop(); // remove first num answer.push_back(first_num); // add data in answer check_num = 0; // initialization } else if (!my_que.empty()) { first_num = my_que.front(); // first num return my_que.pop(); // remove first num my_que.push(first_num); // add data in my_que } else { break; } check_num++; } // output cout << "<"; for (int i=0; i<answer.size(); i++) { cout << answer[i]; if (i != answer.size()-1) cout << ", "; } cout << ">"; }
'Algorithm > _Baekjoon' 카테고리의 다른 글
Baekjoon_17413_단어뒤집기2 (0) 2023.06.06 Baekjoon_10866_덱 (0) 2023.05.24 Baekjoon_10845_큐 (0) 2023.05.18 Baekjoon_1406_에디터 (0) 2023.05.17 Baekjoon_1874_스택 수열 (0) 2023.05.15