https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
큐를 이용해서 K - 1번 push와 pop을 반복해도 좋지만, K번째 원소를 바로 찾을 수 있는 배열을 이용하는 것이 더욱 빠른 문제이다.
#include <cstdio>
#include <vector>
using namespace std;
int main() {
// N: 순열의 길이, K: 순열의 점프 크기
int N, K, idx = 0;
vector<int> v;
// 문제의 조건을 입력받은 뒤 순열을 오름차순으로 채운다
scanf("%d %d", &N, &K);
for (int i = 0; i < N; i++) v.push_back(i + 1);
// 순열의 시작을 출력한 뒤
printf("<");
// 순열을 정해진 순서대로 탐색
while (N--) {
// 순열의 다음 값을 찾고
idx = (idx + K - 1) % v.size();
// 찾은 값을 형식에 맞게 출력한 뒤 순열에서 제거
printf("%d%s", v[idx], N ? ", " : ">\n");
v.erase(v.begin() + idx);
}
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
1181번: 단어 정렬 (0) | 2021.12.07 |
---|---|
1167번: 트리의 지름 (0) | 2021.12.07 |
1157번: 단어 공부 (0) | 2021.12.07 |
1152번: 단어의 개수 (0) | 2021.12.07 |
1149번: RGB거리 (0) | 2021.12.06 |