Study hard
(c++)백준 1158번: 요세푸스 문제 본문
https://www.acmicpc.net/problem/1158
1158번: 요세푸스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
[풀이]
링크드 리스트로 풀었다.
자기 자신의 번호와 다음 사람의 주소로 이루어진 구조체 배열을 만들어 현재 사람에서부터 K번째에 있는 사람을 찾아다니며 제거해주었다.
#include <iostream>
#include <vector>
using namespace std;
struct Person {
int Num;//자기 번호
Person *next;//다음 사람 번호
};
Person P[5001];
vector<int>Remove;//원에서 제거되는 순서
Person *nowP;//현재 위치
int N, K;
//원 이어주기
void makeCircle() {
for (int i = 0; i < N; i++) {
P[i].Num = i;
P[i].next = P + i + 1;
}
P[N].Num = N;
P[N].next = P+1;
nowP = P;
}
//K번째 사람 찾아서 제거
void findK() {
Person *p;//이전 사람이 누구인지 저장
for (int i = 1; i <= K; i++) {
p = nowP;
nowP = nowP->next;
}
//K번째 사람 제거
p->next = nowP->next;
Remove.push_back(nowP->Num);
nowP = p;
}
void solution() {
cin >> N >> K;
makeCircle();//원 이어주기
int Cnt = N;
while (Cnt--) {
findK();//K번째 사람 제거
}
cout << '<';
for (int i = 0; i < N - 1; i++) {
cout << Remove[i] << ", ";
}
cout << Remove[N - 1] << '>';
}
int main() {
solution();
return 0;
}
'백준 > 여러가지 문제들' 카테고리의 다른 글
(c++)백준 2609번: 최대공약수와 최소공배수 (0) | 2020.06.15 |
---|---|
(c++)백준 1168번: 요세푸스 문제 2 (0) | 2020.06.14 |
(c++)백준 1406번: 에디터 (0) | 2020.06.14 |
(c++)백준 11656번: 접미사 배열 (0) | 2020.06.13 |
(c++)백준 10824번: 네 수 (0) | 2020.06.13 |