[Data Structure] Java Binary Search Tree ๊ตฌํ˜„

Goghยท2023๋…„ 1์›” 2์ผ

Data Structure

๋ชฉ๋ก ๋ณด๊ธฐ
4/5

๐ŸŽฏ ๋ชฉํ‘œ :ย  ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๊ท ํ˜• ์žกํžŒ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ ํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•™์Šต

๐Ÿ“’ Binary Search Tree

๐Ÿ“Œ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์กฐ๊ฑด

  • ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์œ ์ผํ•œ ํ‚ค๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ์˜ ํ‚ค๋Š” ๋ฃจํŠธ์˜ ํ‚ค๋ณด๋‹ค ์ž‘๋‹ค.
  • ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ์˜ ํ‚ค๋Š” ๋ฃจํŠธ์˜ ํ‚ค๋ณด๋‹ค ํฌ๋‹ค
  • ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ ๋ชจ๋‘ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋‹ค.

๐Ÿ“Œย ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์žฅ์ ย 

  • ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•˜๋‹ค.
  • ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ํ•˜๋ฉด ํ‚ค๊ฐ’์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์–ป์„์ˆ˜ ์žˆ๋‹ค.
  • ์ด์ง„ ๊ฒ€์ƒ‰๊ณผ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์•„์ฃผ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์ง€์šฐ๋Š” ๊ฒƒ์ด ์‰ฝ๋‹ค.

๐Ÿ“’ย ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ๊ตฌํ˜„

๐Ÿ“Œย ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ๊ฐœ๋ณ„ Node Class

  • ๊ฐ ๋…ธ๋“œ๋ฅผ ์ •์˜ํ•  Class
  • ๊ฐ ๋…ธ๋“œ๋Š” ๊ณ ์œ ์˜ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋งด๋ฒผ ๋ณ€์ˆ˜ Key๊ฐ€ ์žˆ๋‹ค.
  • ๊ฐ ๋…ธ๋“œ๋Š” ๊ณ ์œ ์˜ ํ‚ค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋งด๋ฒ„ ๋ณ€์ˆ˜ value๊ฐ€ ์žˆ๋‹ค.
  • ๊ณ ์œ ์˜ ํ‚ค๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋งด๋ฒ„ ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค(left, right).
  • ๊ฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฒŒํ„ฐ ์„ธํ„ฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š” print ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.
    static class Node<Key,Value>{
        private Key key;
        private Value data;
        private Node<Key,Value> left;
        private Node<Key,Value> right;

        public Node(Key key, Value data, Node<Key, Value> left, Node<Key, Value> right) {
            this.key = key;
            this.data = data;
            this.left = left;
            this.right = right;
        }

        public Key getkey() { return key; }

        public void setKey(Key key) { this.key = key; }

        public Value getData() { return data; }

        public void setData(Value data) { this.data = data; }

        // ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
        public void print(){ System.out.println(data); }
    }

๐Ÿ“Œ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜, ์ƒ์„ฑ์ž, ์‚ฝ์ž… ์š”์†Œ ๋น„๊ต ๋ฉ”์†Œ๋“œ

  • Node ํด๋ž˜์Šค์˜ root ๋ณ€์ˆ˜, ์‚ฝ์ž… ์š”์†Œ๋ฅผ ๋น„๊ตํ•  Comparator
  • root๊ฐ’์„ null ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๊ณ , comparator๊ฐ€ ๋”ฐ๋กœ ์ •์˜ ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ƒ์„ฑ์ž๋กœ ๋ฐ›์•„ ์„ ์–ธํ•œ๋‹ค.
  • ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ธ์ž๋กœ ๋ฐ›์•˜์„๋•Œ ๊ธฐ๋ณธ ์ •๋ ฌ ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•  ๋ฉ”์†Œ๋“œ comp()
    private Node<Key,Value> root;
    private Comparator<? super Key> comparator = null;
    // root์˜ ๊ฐ’ ์ดˆ๊ธฐํ™” ์ƒ์„ฑ์ž
    public BsTreeLink (){
        root=null;
    }
    // ๋น„์–ด์žˆ๋Š” ๋ฃจํŠธ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ „๋‹ฌ๋ฐ›์€ comparator์„ ์ •์˜ํ•œ๋‹ค.
    public BsTreeLink (Comparator<? super Key> c){
        this();
        comparator = c;
    }
    private int comp(Key key1, Key key2){
        return (comparator == null) ?
                // ๊ธฐ๋ณธ ์ •๋ ฌ ๊ธฐ์ค€์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋ฉด compareTo ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ตฌํ˜„๋œ๋‹ค.
                ((Comparable<Key>)key1).compareTo(key2)
                // ์ƒ์„ฑ์ž๋กœ ํŠธ๋ฆฌ ์ƒ์„ฑ์„ ํ–ˆ๋‹ค๋ฉด, ๋น„๊ต์ž๋กœ ๋น„๊ต
                : comparator.compare(key1,key2);
    }

๐Ÿ“Œ ํƒ์ƒ‰ ๋ฉ”์†Œ๋“œ search(key)

search ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๋ฃจํŠธ๋ฅผ p๋กœ ์ •์˜ํ•œ๋‹ค.
  • p๊ฐ€ null ์ด๋ฉด ๊ฒ€์ƒ‰์— ์‹คํŒจํ›„ ๋ฉ”์†Œ๋“œ ์ข…๋ฃŒ.
  • ๊ฒ€์ƒ‰ํ•˜๋Š” ๋…ธ๋“œ์˜ key์™€ p์˜ key๋ฅผ ๋น„๊ต.
  • ์ž‘์œผ๋ฉด ์™ผ์ชฝ ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€์„œ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ p๋กœ ์ •์˜ํ›„ 1์˜ ๊ณผ์ •๋ถ€ํ„ฐ ๋‹ค์‹œ ํƒ์ƒ‰ํ•œ๋‹ค.
    public  Value search(Key key){
        Node<Key, Value> p = root;
        while (true){
            if(p==null) return null; // ์‹คํŒจ
            int cond = comp(key,p.getkey()); // key์™€ p์˜ ํ‚ค๊ฐ’ ๋น„๊ต
            if (cond == 0) return p.getData(); // ๊ฐ™๋‹ค๋ฉด Data ๋ฐ˜ํ™˜
            else if(cond<0) p= p.left; // ์ž‘๋‹ค๋ฉด cond๋Š” -1์ผ ๊ฒƒ์ด๊ณ  ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ๋‹ค์‹œ๊ฒ€์ƒ‰
            else p=p.right; // ํฌ๋‹ค๋ฉด cond๋Š” 1์ผ ๊ฒƒ์ด๊ณ  ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ๋‹ค์‹œ๊ฒ€์ƒ‰
        }
    }

๐Ÿ“Œ ์‚ฝ์ž… ๋ฉ”์†Œ๋“œ add(node,key,data)

add ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  p๋กœ ์ •์˜ํ•œ๋‹ค.
  • ์‚ฝ์ž…ํ•  key์™€ p์˜ ํ‚ค๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค. ๊ฐ™๋‹ค๋ฉด ์‹คํŒจ ๋ฉ”์†Œ๋“œ ์ข…๋ฃŒ.
  • ์ž‘๋‹ค๋ฉด ์™ผ์ชฝ ๋…ธ๋“œ๋กœ ๊ฐ€์„œ ๋น„์–ด์žˆ๋‹ค๋ฉด ์‚ฝ์ž… ๊ฐ™์ด ์žˆ๋‹ค๋ฉด ์žฌ๊ท€ ํ˜ธ์ถœ.
  • ํฌ๋‹ค๋ฉด ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๋กœ ๊ฐ€์„œ ๋น„์–ด ์žˆ๋‹ค๋ฉด ์‚ฝ์ž… ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์žฌ๊ท€ ํ˜ธ์ถœ.
    private void addNode(Node<Key,Value> p,Key key, Value data){
        int cond = comp(key,p.getkey());
        if(cond==0) return; // ๊ฐ™๋‹ค๋ฉด ์ข…๋ฃŒ
        else if (cond<0) { // ์ž‘๋‹ค๋ฉด ์™ผ์ชฝ์œผ๋กœ ๊ฐ€์„œ ๋น„๊ต
            if(p.left==null) p.left = new Node<Key,Value>(key,data,null,null);
            else addNode(p.left,key,data);
        }else { // ํฌ๋‹ค๋ฉด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€์„œ ๋น„๊ต
            if(p.right==null) p.right = new Node<Key,Value>(key,data,null,null);
            else addNode(p.right,key,data);
        }
    }

    public void add(Key key, Value data){
        // ๋ฃจํŠธ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ƒ์„ฑ
        if(root == null) root = new Node<Key,Value>(key,data,null,null);
        // ์•„๋‹ˆ๋ผ๋ฉด addNode ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœํ•˜์—ฌ ๋น„์–ด์žˆ๋Š” ๋…ธ๋“œ์— ํ‚ค์™€ ๋ฐ์ดํ„ฐ ๊ฐ’ ์‚ฝ์ž…
        else addNode(root,key,data);
    }

๐Ÿ“Œ ์‚ญ์ œ ๋ฉ”์†Œ๋“œ remove(Node)

remove ์•Œ๊ณ ๋ฆฌ์ฆ˜

1. ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ
1.1 ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ์™ผ์ชฝ์ด๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ null
1.2 ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ์ด๋ฉด ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋ฅผ null
2.์ž์‹ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ
2.1 ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ์™ผ์ชฝ์ด๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋…ธ๋“œ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ์ •์˜
2.2 ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ์ด๋ฉด ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋…ธ๋“œ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ์ •์˜
3. ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋‘˜์ธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ
3.1 ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ํ‚ค๊ฐ’์ด ๊ฐ€์žฅ ํฐ ๋…ธ๋“œ๋ฅผ ๊ฒ€์ƒ‰
3.2 ๊ฒ€์ƒ‰ํ•  ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋…ธ๋“œ๋กœ ๋ณต์‚ฌ
3.3 ๊ฒ€์ƒ‰ํ•œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ
3.3.1 3.3์—์„œ ์‚ญ์ œํ•œ ๋…ธ๋“œ์— ์ž์‹์ด ์—†๋‹ค๋ฉด 1์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ์‚ญ์ œ
3.3.2 3.3์—์„œ ์‚ญ์ œํ•œ ๋…ธ๋“œ์— ์ž์‹์ด 1๊ฐœ๋งŒ ์žˆ๋‹ค๋ฉด 2์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ์‚ญ์ œ
# ์„œ๋ธŒ ํŠธ๋ฆฌ์—์„œ ํ‚ค๊ฐ’์ด ๊ฐ€์žฅ ํฐ ๋…ธ๋“œ๋ฅผ ๊ฒ€์ƒ‰ ํ•˜์˜€์„๋•Œ ์ž์‹์ด ํ•˜๋‚˜๊ฑฐ๋‚˜ ์—†๋Š” ๊ฒฝ์šฐ๋ฐ–์— ์—†๋‹ค.
    public boolean remove(Key key){
        Node<Key,Value> p = root; // ํƒ์ƒ‰์ค‘์ธ ๋…ธ๋“œ
        Node<Key,Value> parent = null; // ํƒ์ƒ‰์ค‘์ธ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ
        boolean isLeftChild = true; // p๊ฐ€ ๋ถ€๋ชจ์˜ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ์ธ์ง€ ํ™•์ธ

        // ์‚ญ์ œํ•  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰
        while (true){
            if(p==null) return false; // ํƒ์ƒ‰์ค‘์ธ ๋…ธ๋“œ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ์‚ญ์ œ ์‹คํŒจ.
            int cond = comp(key,p.getkey()); // key์™€ p์˜ ํ‚ค ๊ฐ’์„ ๋น„๊ต
            if(cond==0) break; // ์ฐพ์œผ๋ฉด ๋ฐ˜๋ณต๋ฌธ ๋น ์ ธ๋‚˜๊ฐ.
            else {
                parent = p;
                if(cond<0){
                    isLeftChild = true;
                    p = p.left;
                } else {
                    isLeftChild = false;
                    p= p.right;
                }
            }
        }
        // p์˜ ์™ผ์ชฝ ๋…ธ๋“œ๊ฐ€ ์—†์„๋•Œ
        if (p.left==null){
            if(p==root) root = p.right; // root๋ฅผ ์‚ญ์ œํ• ๋•Œ
                // ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ผ๋•Œ
            else if(isLeftChild) parent.left = p.right;
                // ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ผ๋•Œ
            else parent.right = p.right;
        // p์˜ ์–‘์ชฝ ๋…ธ๋“œ๊ฐ€ ์—†์„๋•Œ
        } else if (p.right == null) {
            if(p==root) root=p.left; // root๋ฅผ ์‚ญ์ œํ• ๋•Œ
            else if(isLeftChild) parent.left = p.left;
            else parent.right = p.left;
        } else {
            // ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์–‘์ชฝ ๋ชจ๋‘ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„๋•Œ.
            parent = p;
            Node<Key,Value> left = p.left;
            isLeftChild = true;
            // ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์—์„œ ๊ฐ€์žฅ ํฐ ํ‚ค ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
            while (left.right != null){
                parent = left;
                left = left.right;
                isLeftChild = false;
            }
            p.key = left.key;
            p.data = left.data;
            if(isLeftChild) parent.left = left.left;
            else parent.right = left.left;
        }
        return true;
    }

๐Ÿ“Œ ์ˆœํšŒ์™€ ์ถœ๋ ฅ

์ค‘์œ„ ์ˆœํšŒ, ์ „์œ„ ์ˆœํšŒ, ํ›„์œ„ ์ˆœํšŒ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.

    // ์ค‘์œ„ ์ˆœํšŒ
    private void inorderSubTree(Node node){
        if(node != null){
            inorderSubTree(node.left);
            System.out.println(node.key+" = "+node.data);
            inorderSubTree(node.right);
        }
    }
    // ์ „์œ„ ์ˆœํšŒ
    private void preOrderSubTree(Node node){
        if(node != null){
            System.out.println(node.key+" = "+node.data);
            preOrderSubTree(node.left);
            preOrderSubTree(node.right);
        }
    }
    // ํ›„์œ„ ์ˆœํšŒ
    private void postOrderSubTree(Node node){
        if(node != null){
            postOrderSubTree(node.left);
            postOrderSubTree(node.right);
            System.out.println(node.key+" = "+node.data);
        }
    }

    // ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ
    public void print(){
        inorderSubTree(root);
    }
    public void preOrderPrint(){
        preOrderSubTree(root);
    }
    public void postOrderPrint(){
        postOrderSubTree(root);
    }

๐Ÿ“Œ ๊ท ํ˜• ํƒ์ƒ‰ ํŠธ๋ฆฌ

  • ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ๊ฒ€์ƒ‰ ์‚ฝ์ž… ์‚ญ์ œ ํ•˜๋Š” ๊ณผ์ •์„ ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์ง€๋งŒ,ํ‚ค ๊ฐ’์˜ ์˜ค๋ฆ„ ์ฐจ์ˆœ์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์ปค์ง„๋‹ค.
  • ์ด๋ฅผ ๋ณด์™„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ท ํ˜• ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
  • ์ด์ง„ ๊ท ํ˜• ํƒ์ƒ‰ ํŠธ๋ฆฌ์—๋Š” AVLํŠธ๋ฆฌ, ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ ๋“ฑ์ด ์žˆ๋‹ค.
  • ์ถ”ํ›„ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๊ท ํ˜• ํƒ์ƒ‰ ํŠธ๋ฆฌ๋กœ ์žฌ ์กฐ์ •ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์•ผ ๊ฒ ๋‹ค.
profile
์ปดํ“จํ„ฐ๊ฐ€ ํ• ์ผ์€ ์ปดํ“จํ„ฐ๊ฐ€

0๊ฐœ์˜ ๋Œ“๊ธ€