๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

16 ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/Algorithm & Data structure

16 ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

Daehyunii 2022. 8. 14. 15:54

16.1 ํŠธ๋ฆฌ๋ž€?

  ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ํ•œ ์ข…๋ฅ˜์ด๊ณ , ์ด์ง„ ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํŠธ๋ฆฌ๋ž€ ๋ฌด์—‡์ผ๊นŒ?

ํŠธ๋ฆฌ๋ž€, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ๋…ธ๋“œ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋‹ค๋ฅด๊ฒŒ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ์„ ํ˜• ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ํ•˜๋‚˜์˜ ์ค„๋กœ ์ด์–ด์ ธ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ํŠธ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐˆ๋ž˜์˜ ์ค„๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์„ ํ˜• ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ๋…ธ๋“œ๋“ค์ด ์ž์‹ ๋ณด๋‹ค ๋” ๋‚ฎ์€ ๊ณณ์— ์žˆ์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ์—๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ฆ‰, ๋…ธ๋“œ๊ฐ€ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ, ์ž์‹์ด ๋ถ€๋ชจ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ์—๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์—์„œ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ๋ฃจํŠธ๋…ธ๋“œ์—์„œ ๋ฉ€์–ด์ง€๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค. ๋ฃจํŠธ๋Š” ํ•˜๋‚˜์ด์–ด์•ผ ํ•˜๊ณ  ๋ฃจํŠธ๊ฐ€ ๋‘ ๊ฐœ์ธ ๊ฒฝ์šฐ์—๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ฆ‰, ์ถœ๋ฐœ์ ์€ ๋ฃจํŠธ ๋‹จ ํ•˜๋‚˜๋‹ค. ์šด์˜์ฒด์ œ์—์„œ ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ์‹์„ ๋– ์˜ฌ๋ฆฐ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ€ป์šฉ์–ด ์ •๋ฆฌ

1) ๋ฃจํŠธ - ํŠธ๋ฆฌ์˜ ๊ผญ๋Œ€๊ธฐ์— ์žˆ๋Š” ์œ ์ผํ•œ ๋…ธ๋“œ๋ฅผ ์ผ์ปซ๋Š” ๋ง

2) ์‹œ๋นŒ๋ง - ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋“ค์„ ์ผ์ปซ๋Š” ๋ง

3) ๋ฆฌํ”„ - ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ๋ฅผ ์ผ์ปซ๋Š” ๋ง

4) ๊ฐ„์„  - ์—ฐ๊ฒฐ์„ ์˜๋ฏธํ•˜๋Š” ์šฉ์–ด

 

16.2 ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

  ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํŠธ๋ฆฌ์˜ ํ•œ ์ข…๋ฅ˜๋กœ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ๋งŽ์€ ์œ ํ˜•์ด ์žˆ์ง€๋งŒ ํŠธ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์ธ ๊ทœ์น™์€ ๋™์ผํ•˜๋‹ค. ๋‹ค๋งŒ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ์ถ”๊ฐ€๋˜๋Š” ๊ทœ์น™์ด ์กด์žฌํ•  ๋ฟ์ด๋‹ค. ๊ทธ ์ค‘์—์„œ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ํŠน๋ณ„ํ•œ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋œ ํŠธ๋ฆฌ์˜ ์ข…๋ฅ˜์ด๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ์œ„์˜ ํŠน์„ฑ๋“ค์—์„œ ํŠน๋ณ„ํ•œ ๊ทœ์น™์ด ๋” ์ถ”๊ฐ€๋œ ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. '๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ๋ณด๋‹ค ํฐ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค' ๋ผ๋Š” ๊ทœ์น™์ด ์ถ”๊ฐ€๋œ๋‹ค. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ ์•„์ฃผ ํšจ์œจ์ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋…ธ๋“œ์˜ ์•Œ๋งž์€ ์ž๋ฆฌ๋ฅผ ์ฐพ๋Š” ๊ฒƒ๋„ ์šฉ์ดํ•˜๋‹ค.

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

 

16.3 ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ & ๋…ธ๋“œ ํด๋ž˜์Šค

  ๋…ธ๋“œ๋Š” ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ๋ฃจํŠธ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•ด ์ค€๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

class Node {
    constructor(value){
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

class BinarySearchTree {
    constructor(){
        this.root = null;
    }
}

16.4 Insert ๋ฉ”์„œ๋“œ

  Insert ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ๋‚ด์— ์•Œ๋งž์€ ์ž๋ฆฌ์— ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆซ์ž์ธ ๊ฒฝ์šฐ์— ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. 

 

โ—Ž์ˆ˜๋„์ฝ”๋“œ

1) ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.

2) ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์— ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‚˜ ํ™•์ธํ•œ๋‹ค.(์—†๋‹ค๋ฉด ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋˜๋ฉด ๋œ๋‹ค)

3) ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด, ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ ๊ฐ’์ด ๋ฃจํŠธ์˜ ๊ฐ’๋ณด๋‹ค ํฐ์ง€ ์ž‘์€์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

4) ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ์„œ ๋” ํฌ๋‹ค๋ฉด ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ์— ๊ฐ’์ด ์žˆ๋‚˜ ํ™•์ธํ•œ๋‹ค.

5) ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜๊ณ  ์ž‘๋‹ค๋ฉด ์™ผ์ชฝ์œผ๋กœ, ํฌ๋‹ค๋ฉด ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‚˜ ํ™•์ธํ•œ๋‹ค.

6) ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋” ์ด์ƒ ๋น„๊ตํ•  ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ์ž๋ฆฌ์— ๋„์ฐฉํ•˜๋ฉด ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

 

class Node {
    constructor(value){
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

class BinarySearchTree {
    constructor(){
        this.root = null;
    }
    insert(value){
        var newNode = new Node(value);
        if(this.root === null){
            this.root = newNode;
            return this;
        }
        
        var current = this.root;
        while(true){
            if(value === current.value) return undefined; // ์ด๋ฏธ ์žˆ๋Š” ๊ฐ’์„ ๋ฐ›์•„๋ฒ„๋ฆฌ๋ฉด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ง
            //๊ทธ๋ž˜์„œ ์ด๊ฑธ ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ•จ(์•„๋ž˜ ์กฐ๊ฑด๋ฌธ์€ ํฐ์ง€ ์ž‘์€์ง€๋งŒ ๋น„๊ตํ•˜๋ฏ€๋กœ)
            
            if(value < current.value){
                if(current.left === null){ // ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ
                    current.left = newNode;
                    return this;
                }
                current = current.left; // ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํฌ์ธํ„ฐ ์ด๋™
            } else {
                if(current.right === null){ // ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ
                    current.right = newNode;
                    return this;
                } 
                current = current.right; // ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํฌ์ธํ„ฐ ์ด๋™
            }
        }
    }

16.5 Find or Search ๋ฉ”์„œ๋“œ

  Find or Search ๋ฉ”์„œ๋“œ๋Š”(์ด๋ฆ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ) ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์ธ์ˆ˜๋กœ ๋ฐ›์€ ๊ฐ’์ด ํŠธ๋ฆฌ์— ์žˆ๋Š”์ง€ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ์ด ๊ณผ์ •์€ ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์—์„œ์˜ ์ƒˆ๋กœ์šด ๊ฐ’์˜ ์‚ฝ์ž… ๊ณผ์ •๊ณผ ์•„์ฃผ ๋น„์Šทํ•˜๋‹ค.

 

โ—Ž์ˆ˜๋„์ฝ”๋“œ

1) ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‚˜ ํ™•์ธํ•œ๋‹ค.(๋ฃจํŠธ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ”๋กœ ์—†๋‹ค๋Š” ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.)

2) ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ™•์ธํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’๊ณผ ๋ฃจํŠธ์˜ ๊ฐ’์ด ๋™์ผํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.(๋™์ผํ•˜๋‹ค๋ฉด ๋)

3) ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๊ฐ’์ด ๋” ํฐ์ง€ ์ž‘์€์ง€ ํ™•์ธํ•œ๋‹ค.

4) ํ™•์ธ ํ›„, ์™ผ์ชฝ ํ˜น์€ ์˜ค๋ฅธ์ชฝ์— ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

5) ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

class Node {
    constructor(value){
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

class BinarySearchTree {
    constructor(){
        this.root = null;
    }
    insert(value){
        var newNode = new Node(value);
        if(this.root === null){
            this.root = newNode;
            return this;
        }
        
        var current = this.root;
        while(true){
            if(value === current.value) return undefined; // ์ด๋ฏธ ์žˆ๋Š” ๊ฐ’์„ ๋ฐ›์•„๋ฒ„๋ฆฌ๋ฉด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ง
            //๊ทธ๋ž˜์„œ ์ด๊ฑธ ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ•จ(์•„๋ž˜ ์กฐ๊ฑด๋ฌธ์€ ํฐ์ง€ ์ž‘์€์ง€๋งŒ ๋น„๊ตํ•˜๋ฏ€๋กœ)
            
            if(value < current.value){
                if(current.left === null){ // ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ
                    current.left = newNode;
                    return this;
                }
                current = current.left; // ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํฌ์ธํ„ฐ ์ด๋™
            } else {
                if(current.right === null){ // ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ
                    current.right = newNode;
                    return this;
                } 
                current = current.right; // ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํฌ์ธํ„ฐ ์ด๋™
            }
        }
    }

    find(value){
        if(this.root === null) return false;
        var current = this.root
        var found = false;
        while(current && !found){
            if(value < current.value){
                current = current.left;
            } else if(value > current.value){
                current = current.right;
            } else {
                found = true;
            }
        }
        if(!found) return undefined;
        return current;
    }
}

16.6 ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•(๊ฐ€์žฅ ์ข‹์€ ์ƒํ™ฉ & ํ‰๊ท ์ ์ธ ์ƒํ™ฉ)

1) Insertion - O(log N)

2) Searching - O(log N)

์ฃผ์˜ ํ•ด์•ผํ•  ์ ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” O(N) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.(ex) ํ•œ ์ค„๋กœ๋งŒ ์ญ‰ ๋…ธ๋“œ๋“ค์ด ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ) ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์ฐจ๋ผ๋ฆฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค.