• 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๋ณด๋‹ค ๋” ๋‚˜์„ ๊ฒƒ ๊ฐ™์•˜์Œ)

  1. ์•ผ๋งค ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ํ˜•์„ฑ
  2. eraseํ•  ๋•Œ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ ์ด์šฉ
  3. ๋ ๋ฒ”์œ„ ์ผ ๋•Œ(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 << ">";
}