11866번: 요세푸스 문제 0
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)
www.acmicpc.net
#include <cstdio>
#include <vector>
using namespace std;
int main(void)
{
int n, k;
int ans, at = 0;
scanf("%d %d", &n ,&k);
// 벡터를 최대갯수인 1000개 설정해놓고 초기화
vector<int> v(1000);
for(int i = 0 ; i < n ; i++)
{
v[i] = i + 1;
}
int curSize = n;
printf("<");
// 1명 남을때까지 반복, 마지막 1명은 끝나고 출력
while(curSize > 1)
{
// at 은 이번 반복 때 제거할 사람을 가리킨다
// k - 1 을 더하는 이유는 이전 at 을 가리키던 사람이 지워지기 때문에,
// 지워졌던 사람까지 포함하여 생각하기 위해서이다
at += k - 1;
// 가리키는 위치가 전체 사람 수를 넘어갈 경우,계속 앞으로 돌려보낸다
while(at >= curSize)
{
at -= curSize;
}
ans = v[at];
// 지워준다
v.erase(v.begin() + at);
printf("%d, ", ans);
curSize--;
}
printf("%d>\n", v[0]);
}
[Try]
1. 맨 뒤와 맨 앞에 원 모양으로 연결된 형태를 사용해서 매번 3칸 뒤로 간다음 해당 값을 출력하고 연결을 끊어주는 식으로 할 수 있을
것 같은데 다 구현하기 귀찮으니 적당한 패턴을 파악
[Point]
1. 로직을 생각해내는데는 금방 걸렸지만, 정확한 위치의 인덱스를 설정하는데 애 좀 먹었다.
2. 큐를 사용했다? 1부터 n 까지 넣어놓고, k 번만큼 앞에서 빼고 뒤로 넣어주는 형식인데 생각지도 못했다. 적절한 자료구조를 생각해
내는 법은 언제쯤 습득할까
3. 위의 방식을 사용해도 0ms 인 걸 보면서 push 와 pop 의 시간복잡도가 O(1) 이라는 걸 다시 한번 느꼈다.
[More]
1. 원형 링크드리스트
'PS > BOJ' 카테고리의 다른 글
[백준] 7568.cpp : 덩치 (0) | 2020.05.14 |
---|---|
[백준] 1436.cpp : 영화감독 숌 (0) | 2020.05.13 |
[백준] 10866.cpp : 덱 (0) | 2020.05.12 |
[백준] 10845.cpp : 큐 (0) | 2020.05.11 |
[백준] 1065.py : 한수 (0) | 2020.05.11 |