- toc {:toc}
๋ฌธ์
์์ธํธ์ค ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1๋ฒ๋ถํฐ N๋ฒ๊น์ง N๋ช ์ ์ฌ๋์ด ์์ ์ด๋ฃจ๋ฉด์ย ์์์๊ณ , ์์ ์ ์ K(โค N)๊ฐย ์ฃผ์ด์ง๋ค. ์ด์ ์์๋๋ก K๋ฒ์งธ ์ฌ๋์ ์ ๊ฑฐํ๋ค. ํ ์ฌ๋์ด ์ ๊ฑฐ๋๋ฉด ๋จ์ ์ฌ๋๋ค๋ก ์ด๋ฃจ์ด์ง ์์ ๋ฐ๋ผ ์ด ๊ณผ์ ์ ๊ณ์ํด ๋๊ฐ๋ค. ์ด ๊ณผ์ ์ N๋ช ์ ์ฌ๋์ด ๋ชจ๋ ์ ๊ฑฐ๋ ๋๊น์ง ๊ณ์๋๋ค. ์์์ ์ฌ๋๋ค์ด ์ ๊ฑฐ๋๋ ์์๋ฅผ (N, K)-์์ธํธ์ค ์์ด์ด๋ผ๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด (7, 3)-์์ธํธ์ค ์์ด์ <3, 6, 2, 7, 5, 1, 4>์ด๋ค.
N๊ณผ K๊ฐ ์ฃผ์ด์ง๋ฉด (N, K)-์์ธํธ์ค ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N๊ณผ K๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์์๋๋ก ์ฃผ์ด์ง๋ค. (1 โค K โค N โค 5,000)
์ถ๋ ฅ
์์ ์ ๊ฐ์ด ์์ธํธ์ค ์์ด์ ์ถ๋ ฅํ๋ค.
์ถ์ฒ:https://www.acmicpc.net/problem/1158
ํ์ด
์ผ๋งค ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ด์ฉ(์ผ๋งค ์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ list๋ณด๋ค ๋ ๋์ ๊ฒ ๊ฐ์์)
- ์ผ๋งค ์ฐ๊ฒฐ๋ฆฌ์คํธ ํ์ฑ
- eraseํ ๋ ์ฐ๊ฒฐ๋๋ ๊ฒ ์ด์ฉ
- ๋ ๋ฒ์ ์ผ ๋(nxt[cursor] != -1) ๋งจ ์ฒ์์ผ๋ก ๋์๊ฐ๋๋ก ์ฒ๋ฆฌ
while๋ฌธ์์ cursor์ ์ด๋์ ๋ํด ์๊ฐํด๋ณผ ๊ฒ
// ์ฐ๊ฒฐ๋ฆฌ์คํธ
#include <bits/stdc++.h>
using namespace std;
const int MX = 10005;
int dat[MX], pre[MX], nxt[MX];
int unused = 1;
int erase(int addr) {
nxt[pre[addr]] = nxt[addr];
if(nxt[addr] != -1) pre[nxt[addr]] = pre[addr];
return addr;
}
void insert(int addr, int d){
dat[unused] = d;
pre[unused] = addr;
nxt[unused] = nxt[addr];
if(nxt[addr] != -1) pre[nxt[addr]] = unused;
nxt[addr] = unused;
unused++;
}
void traverse(){
int cur = nxt[0];
while(cur != -1) {
cout << dat[cur] << ' ';
cur = nxt[cur];
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
fill(pre, pre+MX, -1);
fill(nxt, nxt+MX, -1);
list<int> L = {};
int N, K;
cin >> N >> K;
for(int i = 0; i < N; i++){
insert(i, i+1);
}
cout << "<";
int cursor = 0;
while(nxt[0] != -1){
for (int i = 0; i < K; i++)
{
if(nxt[cursor] != -1)
cursor = nxt[cursor];
else
cursor = nxt[0];
}
cout << erase(cursor);
if(nxt[0] != -1)
cout << ", ";
}
cout << '>';
return 0;
}์ ๋ต์ฝ๋
๋ง์ด ๋ฐฐ์์ผ ํจ์ ๋๋๋คโฆ.
ํจ์ฌ ๊ฐ๊ฒฐํจ.
์ํ ์ฐ๊ฒฐ๋ฆฌ์คํธ ํ์ฑ ๋ฐฉ๋ฒ ์ตํ๊ณ for๋ฌธ ์ฌ์ฉ์ ์ ๋์ฑ ์ตํ๊ธฐ
// Authored by : OceanShape
// Co-authored by : -
// http://boj.kr/b7f7b82420c74d43b13c398fc6c73841
#include <bits/stdc++.h>
using namespace std;
int N, K, len = 0;
// ๋ฆฌ์คํธ์์ ์ด์ ๋
ธ๋/๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์
int pre[5001];
int nxt[5001];
// ์์ธํธ์ค ์์ด์ ์ ์ฅํ๋ ๋ณ์
vector<int> v;
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K;
// ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ฑ
// ๋งจ ์ฒ์ ๋
ธ๋์ ๋ง์ง๋ง ๋
ธ๋๊ฐ ์๋ก๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ง์
for(int i = 1; i <= N; ++i){
pre[i] = (i == 1) ? N : i - 1;
nxt[i] = (i == N) ? 1 : i + 1;
++len;
}
int i = 1;
// ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ํํ๋ฉฐ ์์ด ์์ฑ
for(int cur = 1; len != 0; cur = nxt[cur]){
// K ๋ฒ์งธ์ผ ๋ ์ ๊ฑฐ
if(i == K){
pre[nxt[cur]] = pre[cur];
nxt[pre[cur]] = nxt[cur];
v.push_back(cur);
i = 1;
--len;
} else ++i;
}
// ์์ธํธ์ค ์์ด ์ถ๋ ฅ
cout << "<";
for(size_t i = 0; i < v.size(); ++i) {
cout << v[i];
if(i != v.size() - 1) cout << ", ";
}
cout << ">";
}