๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ

[BOJ] #2164 ์นด๋“œ2

by dar0m! 2020. 6. 2.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
 2 ์ดˆ  128 MB 57.281%
 

2164๋ฒˆ: ์นด๋“œ2

N์žฅ์˜ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นด๋“œ๋Š” ์ฐจ๋ก€๋กœ 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ์œผ๋ฉฐ, 1๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์œ„์—, N๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์•„๋ž˜์ธ ์ƒํƒœ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์นด๋“œ๊ฐ€ ๋†“์—ฌ ์žˆ๋‹ค. ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ์นด๋“œ๊ฐ€

www.acmicpc.net

 

๋ฌธ์ œ

N์žฅ์˜ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นด๋“œ๋Š” ์ฐจ๋ก€๋กœ 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ์œผ๋ฉฐ, 1๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์œ„์—, N๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์•„๋ž˜์ธ ์ƒํƒœ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์นด๋“œ๊ฐ€ ๋†“์—ฌ ์žˆ๋‹ค.

์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ์นด๋“œ๊ฐ€ ํ•œ ์žฅ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค. ์šฐ์„ , ์ œ์ผ ์œ„์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋ฒ„๋ฆฐ๋‹ค. ๊ทธ ๋‹ค์Œ, ์ œ์ผ ์œ„์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ์ œ์ผ ์•„๋ž˜์— ์žˆ๋Š” ์นด๋“œ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด N=4์ธ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ์นด๋“œ๋Š” ์ œ์ผ ์œ„์—์„œ๋ถ€ํ„ฐ 1234 ์˜ ์ˆœ์„œ๋กœ ๋†“์—ฌ์žˆ๋‹ค. 1์„ ๋ฒ„๋ฆฌ๋ฉด 234๊ฐ€ ๋‚จ๋Š”๋‹ค. ์—ฌ๊ธฐ์„œ 2๋ฅผ ์ œ์ผ ์•„๋ž˜๋กœ ์˜ฎ๊ธฐ๋ฉด 342๊ฐ€ ๋œ๋‹ค. 3์„ ๋ฒ„๋ฆฌ๋ฉด 42๊ฐ€ ๋˜๊ณ , 4๋ฅผ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด 24๊ฐ€ ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ 2๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋‚˜๋ฉด, ๋‚จ๋Š” ์นด๋“œ๋Š” 4๊ฐ€ ๋œ๋‹ค.

N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ œ์ผ ๋งˆ์ง€๋ง‰์— ๋‚จ๊ฒŒ ๋˜๋Š” ์นด๋“œ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ N(1≤N≤500,000)์ด ์ฃผ์–ด์ง„๋‹ค.
์ฒซ์งธ ์ค„์— ๋‚จ๊ฒŒ ๋˜๋Š” ์นด๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ•ด๊ฒฐ

Node ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

  • 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์นด๋“œ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค → 28~35๋ฒˆ ์ค„
  • nodeNum ์€ '๋‚จ์•„์žˆ๋Š” ์นด๋“œ์˜ ์ˆ˜'์ด๋ฉฐ ๋งจ ๋’ค๋กœ๋ณด๋‚ด๋Š” ์ž‘์—…์„ ํ•  ์‹œ NULL์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • while ๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ์นด๋“œ๊ฐ€ ํ•˜๋‚˜ ๋‚จ์•„ ์žˆ์„ ๋•Œ ๊นŒ์ง€ ๋ˆ๋‹ค.
    • ๋งจ ์•ž์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  → 39~42๋ฒˆ ์ค„
    • ๊ทธ ๋‹ค์Œ ๋งจ ์•ž์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ๋งจ ๋’ค๋กœ ๋ณด๋‚ธ๋‹ค. → 44~52๋ฒˆ ์ค„
  • ์ด๋ ‡๊ฒŒ while๋ฌธ์„ ๋น ์ ธ๋‚˜์˜จ ๋’ค ๋งจ ์•ž์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์ •๋‹ต์ด๋‹ค.

์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
17560 KB  40 ms
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
 
class Node {
public:
    int data;
    Node* prev;
    Node* next;
    Node() {
        prev = 0;
        next = 0;
    }
};
 
Node head;
Node tail;
int nodeNum;
 
int main() {
    int n;
    scanf("%d"&n);
    // ๋ฌธ์ž์—ด์„ ์ €์žฅํ•  ๋•Œ ๋ฒ”์œ„๋Š”  ์•„์Šคํ‚ค์ฝ”๋“œ. 
    //ํฌ์ธํ„ฐ๊ฐ€ ์ด ๊ฐ’์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ๋์ž„์„ ์•Œ๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด์„œ 
    head.data = -1;
    tail.data = -1;
 
    head.next = &tail;
    tail.prev = &head;
    for (int i = 1; i <= n; i++) {
        Node* nNode = new Node;
        nNode->data = i;
        nNode->prev = tail.prev;
        nNode->next = &tail;
        tail.prev->next = nNode;
        nNode->next->prev = nNode;
    }
    nodeNum = n;
    while (nodeNum > 1) {
        // ๋งจ ์•ž ์‚ญ์ œ
        Node* remove = head.next;
        head.next = remove->next;
        remove->next->prev = &head;
        free(remove); nodeNum--;
        // ๋งจ ์•ž ๋งจ ์•ž์—๊ฑฐ ๋งจ ๋’ค๋กœ ๋ณด๋‚ด๊ธฐ
        Node* front = head.next;
        if (nodeNum >= 2) {
            head.next = front->next;
            front->next->prev = &head;
        }
        tail.prev->next = front;
        front->prev = tail.prev;
        front->next = &tail;
        tail.prev = front;
    }
    printf("%d", head.next->data);
    return 0;
}
cs

 

๋Œ“๊ธ€