Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 1764
- 스택의 특징
- 게리멘더링2
- 백준
- 자료구조
- 해시구현
- 5397
- c#
- qorwns
- Stack 이란
- heap
- 별 찍기 10
- 버킷 정렬
- 시간 복잡도
- 원판 돌리기
- dfs
- 백준 1406
- 해시 구현
- 백준 17779
- 백준 5397
- C/C++ 구현
- 구현
- 백준 2447
- 백준 17471
- ㅣ풀이
- 백준 17822
- 조세퍼스 순열
- AVL 시간 복잡도
- 백준 1158
- 풀이
Archives
- Today
- Total
홍시홍의 프로그래밍
[백준 1158] 조세퍼스 문제 본문
https://www.acmicpc.net/problem/1158
1158번: 조세퍼스 문제
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)
www.acmicpc.net
요구사항
1. 리스트 구현
를 참조하여 구현하였다.
2. 조건 구현
전체의 순서를 저장한 cnt와 현재 index부터 k번째까지의 숫자 index를 나타내는 nowcnt를 이용하여 구현
#include <stdio.h>
#include <algorithm>
#include <list>
#include <iostream>
using namespace std;
struct NODE {
int val;
int prev;
int next;
int flag;
};
const int Node_size = 5000;
struct MY_LIST {
int HEAD = Node_size;
int TAIL = Node_size + 1;
int pos;
int size = 0;
NODE node[Node_size + 2];
MY_LIST(){
pos = 0;
node[HEAD].next = TAIL;
node[TAIL].prev = HEAD;
}
void push_back(int data)
{
int prev = node[TAIL].prev;
int next = node[prev].next; //tail
node[pos].val = data;
node[pos].prev = prev;
node[prev].next = pos;
node[pos].next = next;
node[next].prev = pos;
pos++;
size++;
}
void push_front(int data)
{
int next = node[HEAD].next;
int prev = node[next].prev;
node[pos].val = data;
node[pos].prev = prev;
node[prev].next = pos;
node[pos].next = next;
node[next].prev = pos;
pos++;
size++;
}
void insert(int p, int data)
{
int next = node[HEAD].next;
for (int i = 0; i < p; i++)
{
next = node[next].next;
}
int prev = node[next].prev;
node[pos].val = data;
node[pos].prev = prev;
node[prev].next = pos;
node[pos].next = next;
node[next].prev = pos;
pos++;
size++;
}
void pop_back()
{
int target = node[TAIL].prev;
int prev = node[target].prev;
int next = node[target].next;
node[prev].next = next;
node[next].prev = prev;
size--;
}
void pop_front()
{
int target = node[HEAD].next;
int prev = node[target].prev;
int next = node[target].next;
node[prev].next = next;
node[next].prev = prev;
size--;
}
int erase(int p)
{
int target = node[HEAD].next;
for (int i = 0; i < p; i++)
{
target = node[target].next;
}
int prev = node[target].prev;
int next = node[target].next;
node[prev].next = next;
node[next].prev = prev;
size--;
return node[target].val;
}
int at(int p)
{
int target = node[HEAD].next;
for (int i = 0; i < p; i++)
{
target = node[target].next;
}
return node[target].val;
}
};
MY_LIST my_list;
MY_LIST ans;
int n, m;
void solve()
{
int k = m - 1;
int cnt = 0;
int nowcnt = 0;
while (true)
{
//cout << cnt << " " << my_list.size << " " << my_list.at(cnt) << endl;
if (cnt >= my_list.size)
cnt = 0;
if (my_list.size == 0)
return;
if (nowcnt == k){
int s = my_list.erase(cnt);
// cout << "get" << s << endl;
ans.push_back(s);
nowcnt = 0;
continue;
}
cnt++;
nowcnt++;
if (cnt >= my_list.size)
cnt = 0;
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
my_list.push_back(i);
solve();
printf("<");
for (int i = 0; i < ans.pos; i++)
{
if(i==ans.pos-1)
printf("%d", ans.at(i));
else
printf("%d, ", ans.at(i));
}
printf(">");
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 1764] 듣보잡 (0) | 2019.11.18 |
---|---|
[백준 1158] 조세퍼스 문제 (0) | 2019.11.18 |
[백준 17837] 새로운 게임2 (0) | 2019.11.16 |
[백준 17822] 원판 돌리기 (0) | 2019.11.14 |
[백준 17779] 게리맨더링2 (0) | 2019.11.12 |
Comments