Skip to content

Latest commit

ย 

History

History
189 lines (140 loc) ยท 8.1 KB

0726-tree.md

File metadata and controls

189 lines (140 loc) ยท 8.1 KB

2020.07.26

๐Ÿ“š๊ณต๋ถ€ํ•œ ๊ฑฐ List๐Ÿ“š

  • ํŠธ๋ฆฌ - 25. ์ƒํ˜ธ ๋ฐฐํƒ€์  ์ง‘ํ•ฉ(2)

[์ข…๋งŒ๋ถ] ์ƒํ˜ธ ๋ฐฐํƒ€์  ์ง‘ํ•ฉ

์ƒํ˜ธ ๋ฐฐํƒ€์  ์ง‘ํ•ฉ์˜ ์ตœ์ ํ™”

ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒํ˜ธ ๋ฐฐํƒ€์  ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•  ๊ฒฝ์šฐ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ 

๐Ÿ‘‰ ์—ฐ์‚ฐ์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ž์นซ ํŠธ๋ฆฌ๊ฐ€ ํ•œ์ชฝ์œผ๋กœ ๊ธฐ์šธ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ์•ˆ 1 :: ๋žญํฌ(rank)์— ์˜ํ•œ ํ•ฉ์น˜๊ธฐ(union-by-rank) ์ตœ์ ํ™”

๐Ÿ‘‰ ๋‘ ํŠธ๋ฆฌ๋ฅผ ํ•ฉ์น  ๋•Œ, ํ•ญ์ƒ ๋†’์ด๊ฐ€ ๋” ๋‚ฎ์€ ํŠธ๋ฆฌ๋ฅผ ๋” ๋†’์€ ํŠธ๋ฆฌ ๋ฐ‘์— ์ง‘์–ด๋„ฃ์Œ์œผ๋กœ์จ ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๋†’์•„์ง€๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

-----(2020.07.25 ๊ณต๋ถ€๋‚ด์šฉ)-----

๋žญํฌ์— ์˜ํ•œ ํ•ฉ์น˜๊ธฐ ์ตœ์ ํ™”๋ฅผ ์ด์šฉํ•œ ์ƒํ˜ธ ๋ฐฐํƒ€์  ์ง‘ํ•ฉ์˜ ๊ตฌํ˜„

struct OptimizedDisjointSet {
  //parent[i] : i์˜ ๋ถ€๋ชจ
  //rank[] : ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ํ•œ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ์ผ ๊ฒฝ์šฐ ํ•ด๋‹น ํŠธ๋ฆฌ์˜ ๋†’์ด ์ €์žฅ
  vector<int> parent, rank;
  OptimizedDisjointSet(int n) : parent(n), rank(n,1) {
    for(int i=0; i<n; ++i) parent[i] = i;
  }
  //u๊ฐ€ ์†ํ•œ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋ฒˆํ˜ธ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  int find(int u) {
    if(u == parent[u]) return u;
    return parent[u] = find(parent[u]);
  }
  //u๊ฐ€ ์†ํ•œ ํŠธ๋ฆฌ์™€ v๊ฐ€ ์†ํ•œ ํŠธ๋ฆฌ๋ฅผ ํ•ฉ์น˜๋Š” ํ•จ์ˆ˜
  void merge(int u, int v) {
    //u์™€ v๊ฐ€ ์†ํ•œ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•œ๋‹ค.
    u = find(u);
    v = find(v);
    //u์™€ v๊ฐ€ ์ด๋ฏธ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•˜๋ฉด ํ•ฉ์น˜๊ธฐ ์—ฐ์‚ฐ ํ•„์š” ์—†๋‹ค.
    if(u==v) return;
    //๋งŒ์•ฝ u๊ฐ€ ์†ํ•œ ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๋” ๋†’์œผ๋ฉด, u์™€ v๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
    if(rank[u] > rank[v]) swap(u,v);
    //u์˜ ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ v๊ฐ€ ์†ํ•œ ํŠธ๋ฆฌ์˜ ๋†’์ด๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ๋‚ฎ์€ ์ƒํƒœ์ด๋‹ค. 
    parent[u] = v; //u์˜ ๋ถ€๋ชจ๋ฅผ v๋กœ ์„ค์ •ํ•˜๋ฏ€๋กœ์จ, u์˜ ํŠธ๋ฆฌ๋ฅผ v์˜ ํŠธ๋ฆฌ์— ํ•ฉ์นœ๋‹ค.
    //๋งŒ์•ฝ ๋‘ ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ํ•ฉ์ณ์ง„ ๊ฒฐ๊ณผ ํŠธ๋ฆฌ v์˜ ๋†’์ด๋Š” 1 ์ฆ๊ฐ€ํ•œ ์ƒํƒœ์ด๋‹ค.
    if(rank[u] == rank[v]) ++rank[v];
  }
};

โฑTime-Complexityโฑ

์ด๋ ‡๊ฒŒ ์ตœ์ ํ™”๋ฅผ ํ•˜๋ฉด find() ์—ฐ์‚ฐ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” **lg(ํฌํ•จํ•œ ๋…ธ๋“œ์˜ ์ˆ˜)**์— ๋น„๋ก€ํ•˜์—ฌ ํ•ฉ์น˜๊ธฐ ์—ฐ์‚ฐ๊ณผ ์ฐพ๊ธฐ ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” **O(lgN)**์ด๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ์•ˆ 2 :: ๊ฒฝ๋กœ ์••์ถ•(path compression) ์ตœ์ ํ™”

๐Ÿ‘‰ find(u)๋ฅผ ํ†ตํ•ด u๊ฐ€ ์†ํ•˜๋Š” ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ฅผ ์ฐพ์•˜์„ ๋•Œ parent[u]๊ฐ’์„ ์ด ๋ฃจํŠธ๋กœ ๋ฐ”๊พธ๋ฉด ๋˜ ๋‹ค์‹œ find(u)๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ๋ฐ”๋กœ ๋ฃจํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

int find(int u) {
    if(u == parent[u]) return u;
    return parent[u] = find(parent[u]);
  }

๐Ÿ“์˜ˆ์ œ::๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ์„ฑ ํ™•์ธํ•˜๊ธฐ

N๊ฐœ์˜ ๋„์‹œ๊ฐ€ ๋„๋กœ๋ง์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  ๊ฐ ๋„๋กœ๊ฐ€ ์ •ํ™•ํžˆ ๋‘ ๊ฐœ์˜ ๋„์‹œ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค. ํญ์„ค๋กœ ์ธํ•œ ๋„๋กœ ๋งˆ๋น„ ํ›„ ๋„๋กœ๊ฐ€ ํ•˜๋‚˜์”ฉ ๋ณต๊ตฌ๋  ๋•Œ๋งˆ๋‹ค ์ž„์˜์˜ ๋‘ ๋„์‹œ ๊ฐ„์— ์„œ๋กœ ์™•๋ž˜๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ์•Œ์•„๋ณด๋Š” ๋ฌธ์ œ.

โšก๏ธkeypointโšก๏ธ

  1. ๊ฐ ๋„์‹œ๋ฅผ ์›์†Œ๋กœ ํ•˜๊ณ , ์™•๋ž˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋„์‹œ๋“ค์„ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
  2. a,b๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋„๋กœ๊ฐ€ ๋ณต๊ตฌ๋˜์—ˆ์„ ๋•Œ, a์™€ ์—ฐ๊ฒฐ๋œ ๋„์‹œ๋“ค์˜ ์ง‘ํ•ฉ๊ณผ b์™€ ์—ฐ๊ฒฐ๋œ ๋„์‹œ๋“ค์˜ ์ง‘ํ•ฉ์„ ํ•ฉ์นœ๋‹ค.

+Kruskal์˜ ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ(Minimum Spanning Tree) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐Ÿ“์˜ˆ์ œ::๊ฐ€์žฅ ํฐ ์ง‘ํ•ฉ ์ถ”์ ํ•˜๊ธฐ

๊ฐ ์ง‘ํ•ฉ์— ์†ํ•œ ์›์†Œ์˜ ์ˆ˜๋ฅผ ์ถ”์ ํ•˜๋Š”๋ฐ ๊ตฌ๊ฐ„ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง‘ํ•ฉ๋“ค์ด ํ•ฉ์ณ์ง€๋Š” ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ํฐ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€ ์ถ”์ ํ•˜๊ฑฐ๋‚˜ ๊ณผ๋ฐ˜์ˆ˜๊ฐ€ ์ถœํ˜„ํ•˜๋Š” ์‹œ์ ์„ ์ฐพ๋Š” ๋ฌธ์ œ๋„ ๊ตฌ๊ฐ„ํŠธ๋ฆฌ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

โšก๏ธkeypointโšก๏ธ

  1. ๊ฐ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด size[]๋ฅผ ์ถ”๊ฐ€ํ•œ ๋’ค ๋‘ ์ง‘ํ•ฉ์ด ํ•ฉ์ณ์งˆ ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.

๐Ÿ“์˜ˆ์ œ::์—๋””ํ„ฐ ์ „์Ÿ(ID: EDITORWARS)

๋‘ ์ข…๋ฅ˜์˜ ํŽธ์ง‘๊ธฐ๊ฐ€ ์žˆ๋‹ค. ๊ฐ ํŽธ์ง‘๊ธฐ์— ๋Œ€ํ•ด ์“ด ๋Œ“๊ธ€๋กœ ์ด ์‚ฌ๋žŒ์ด ์–ด๋–ค ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์œ ์ถ”ํ•˜์—ฌ ํ•ด๋‹น ํŽธ์ง‘๊ธฐ๋ชจ์ž„์— ์ดˆ๋Œ€ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด ๋•Œ, ํ•œ ํŒŒํ‹ฐ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ธ์›์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฌธ์ œ.

์ƒํ˜ธ ์ธ์ • ๋Œ“๊ธ€์€ ACK a b ํ˜•ํƒœ๋กœ, ์ƒํ˜ธ ๋น„๋ฐฉ ๋Œ“๊ธ€์€ DIS a b ํ˜•ํƒœ๋กœ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง„๋‹ค.

โšก๏ธkeypointโšก๏ธ

  1. (์›์น™ 1) ๋‚ด๊ฐ€ ์ƒ๋Œ€๋ฐฉ๊ณผ ๊ฐ™์€ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ƒ๋Œ€๋ฐฉ๊ณผ ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ๋ฅผ ์“ฐ๋Š” ์‚ฌ๋žŒ์€ ๋‚˜์™€๋„ ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  2. (์›์น™ 2) ๋‚ด๊ฐ€ ์ƒ๋Œ€๋ฐฉ๊ณผ ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ƒ๋Œ€๋ฐฉ๊ณผ ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ๋ฅผ ์“ฐ๋Š” ์‚ฌ๋žŒ์€ ๋‚˜์™€ ๊ฐ™์€ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

โŒจ๏ธ์—๋””ํ„ฐ ์ „์Ÿ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ƒํ˜ธ ๋ฐฐํƒ€์  ์ง‘ํ•ฉ

parent[i] = i : i์˜ ๋ถ€๋ชจ๋…ธ๋“œ. ๋งŒ์•ฝ, i๊ฐ€ ๋ฃจํŠธ์ธ ๊ฒฝ์šฐ parent[i] ๋Š” ์ž๊ธฐ ์ž์‹ ์ด๋‹ค.

rank[i] : i๊ฐ€ ๋ฃจํŠธ์ธ ๊ฒฝ์šฐ, i๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ํŠธ๋ฆฌ์˜ ๋žญํฌ(= ๋†’์ด)

enemy[i] : i๊ฐ€ ๋ฃจํŠธ์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ง‘ํ•ฉ๊ณผ ์ ๋Œ€๊ด€๊ณ„์ธ ์ง‘ํ•ฉ์˜ ๋ฃจํŠธ (์—†์œผ๋ฉด -1)

size[i] : i๊ฐ€ ๋ฃจํŠธ์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ(= ์›์†Œ์˜ ๊ฐœ์ˆ˜)

struct BipartiteUnionFind {
  vector<int> parent, rank, enemy, size;
  BipartiteUnionFind(int n) : parent(n), rank(n,0), enemy(n,-1), size(n,1) {
    for(int i=0; i<n; ++i) parent[i] = i;
  }
  int find(int u) {
    if(parent[u] == u) return u;//๋ฃจํŠธ์ธ ๊ฒฝ์šฐ, ์ž์‹  ๋ฐ˜ํ™˜
    return parent[u] = find(parent[u]); //๋ฃจํŠธ ์•„๋‹ˆ๋ฉด, u์˜ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๋ฃจํŠธ ๋ฐ˜ํ™˜
  }
  int merge(int u, int v) {
    if(u==-1 || v==-1) //u์™€ v๊ฐ€ ๊ณต์ง‘ํ•ฉ์ด๋ผ๋ฉด ๋‘˜ ์ค‘์— ํฐ ๊ฑฐ ๋ฐ˜ํ™˜
      return max(u,v); 
    u = find(u); v = find(v);
    if(u==v) //u์™€ v๊ฐ€ ์ด๋ฏธ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์žˆ๋‹ค๋ฉด, ๋‘˜ ์ค‘ ํ•˜๋‚˜์ธ u ๋ฐ˜ํ™˜(v๋„ ๋จ)
      return u; 
    if(rank[u] > rank[v]) //๋งŒ์•ฝ u์˜ ํŠธ๋ฆฌ๋†’์ด๊ฐ€ ๋” ๋†’๋‹ค๋ฉด, ๋ฐ”๊ฟ”์ค€๋‹ค.(u๊ฐ€ ๋” ํฌ์ง€์•Š๋„๋ก)
      swap(u,v);
    //ํ˜„์žฌ u์˜ ํŠธ๋ฆฌ ๋†’์ด๊ฐ€ v์˜ ํŠธ๋ฆฌ ๋†’์ด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ƒํƒœ์ด๋‹ค. 
    //u์™€ v์˜ ํŠธ๋ฆฌ๋†’์ด๊ฐ€ ๊ฐ™๋‹ค๋ฉด, v์˜ ๋†’์ด๋ฅผ +1ํ•ด์ค€๋‹ค.(๊ทธ๋ฆผ๊ทธ๋ฆฌ๋ฉด ์ดํ•ด์‰ฝ๋‹ค)
    if(rank[u] == rank[v]) rank[v]++;
    parent[u] = v; //u์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ v๋กœ ์„ค์ •
    size[v] += size[u]; //์›์†Œ์˜ ๊ฐœ์ˆ˜ ๊ฐฑ์‹ 
    return v;
  }
  //u์™€ v๊ฐ€ ์„œ๋กœ ์ ๋Œ€๊ด€๊ณ„์ผ ๋•Œ, ๋ชจ์ˆœ์œ ๋ฌด์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
  int dis(int u, int v) {
    u = find(u); v = find(v); //์ผ๋‹จ ๋ฃจํŠธ ์ฐพ์•„์ฃผ๊ณ 
    if(u == v) return false; //์ ๋Œ€๊ด€๊ณ„์ธ๋ฐ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•ด์žˆ์œผ๋ฉด ๋ชจ์ˆœ
    int a = merge(u, enemy[v]);//'u'์™€ 'v์™€ ์ ๋Œ€๊ด€๊ณ„์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค'์„ ํ•ฉ์นœ๋‹ค. 
    int b = merge(v, enemy[u]);//'v'์™€ 'u์™€ ์ ๋Œ€๊ด€๊ณ„์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค'์„ ํ•ฉ์นœ๋‹ค. 
    enemy[a] = b; //์ง‘ํ•ฉ b๊ฐ€ a์˜ ์ ๋Œ€๊ด€๊ณ„์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ง‘ํ•ฉ์ด ๋˜๋„๋ก ์„ค์ • 
    enemy[b] = a; //์ง‘ํ•ฉ a๊ฐ€ b์˜ ์ ๋Œ€๊ด€๊ณ„์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ง‘ํ•ฉ์ด ๋˜๋„๋ก ์„ค์ •
    return true;
  }
  //u์™€ v๊ฐ€ ์„œ๋กœ ๊ฐ™์€ ์ง‘ํ•ฉ์ผ ๋•Œ(๊ฐ™์€ ์—๋””ํ„ฐ ์‚ฌ์šฉ ์‹œ), ๋ชจ์ˆœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
  //๋ชจ์ˆœ; u์™€ v๊ฐ€ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์— ์†ํ•  ๋•Œ
  //์›์น™; u๊ฐ€ v๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์ด๋ฏ€๋กœ u์˜ ์ ๋Œ€๊ด€๊ณ„ ์ง‘ํ•ฉ์€ v์˜ ์ ๋Œ€๊ด€๊ณ„ ์ง‘ํ•ฉ๊ณผ ๊ฐ™๋‹ค.
  int ack(int u, int v) {
    u = find(u), v = find(v); //๋ฃจํŠธ ์ฐพ์•„์ฃผ๊ณ 
    if(enemy[u] == v) return false; //๋ชจ์ˆœ
    int a = merge(u,v); //a์—๋Š” u์™€ v๋ฅผ ํ•ฉ์น˜๊ณ 
    int b = merge(enemy[u], enemy[v]); //์›์น™์— ๋”ฐ๋ผ, u,v์— ์ ๋Œ€๊ด€๊ณ„ ์ง‘ํ•ฉ์„ ํ•ฉ์นœ๋‹ค.
    enemy[a] = b; //์ง‘ํ•ฉ b๊ฐ€ a์˜ ์ ๋Œ€๊ด€๊ณ„์ง‘ํ•ฉ์ด ๋˜๋„๋ก ์„ค์ • 
    //๋‘ ์ง‘ํ•ฉ ๋‹ค ์ ๋Œ€ํ•˜๋Š” ์ง‘ํ•ฉ์ด ์—†์œผ๋ฉด(= enemy[u]์™€ enemy[v]๊ฐ€ ๊ณต์ง‘ํ•ฉ์ด๋ฉด) b=-1 
    if(b != -1) enemy[b] = a; 
    return true;
  }
};
int maxParty(const BipartiteUnionFind& buf) {
  int ret = 0;
  for(int node=0; node<n; ++node) { //n:์ „์ฒด ํšŒ์›์˜ ์ˆ˜
    if(buf.parent[node] == node) {//node๊ฐ€ ๋ฃจํŠธ์ด๋ฉด
      int enemy = buf.enemy[node];//node์™€ ์ ๋Œ€๊ด€๊ณ„์— ์žˆ๋Š” ์‚ฌ๋žŒ์„ enemy๋ผ๊ณ  ํ•˜๊ณ 
      if(enemy > node) continue; //์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ
      int mySize = buf.size[node];//node์˜ ์ง‘ํ•ฉํฌ๊ธฐ๋ฅผ mySize๋ผ๊ณ  ํ•˜๊ณ 
      //์ ๋Œ€๊ด€๊ณ„์— ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์—†๋‹ค๋ฉด ์ง‘ํ•ฉํฌ๊ธฐ๋ฅผ 0์œผ๋กœ, ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ ์ˆ˜๋งŒํผ enemySize ์„ค์ •
      int enemySize = (enemy==-1 ? 0 : buf.size[enemy]);
      ret += max(mySize, enemySize);//์ตœ๋Œ€์ธ์›์ˆ˜ ๊ฐฑ์‹ 
    }
  }
  return ret;
}