๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ Computer Science/Algorithm

[Algorithm] ํ•ฉ๋ณ‘ ์ •๋ ฌ(Merge Sort)๋ž€? (feat. Swift)

by Fomagran ๐Ÿ’ป 2021. 10. 14.
728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” Foma ๐Ÿ’ป ์ž…๋‹ˆ๋‹ค!

์˜ค๋Š˜์€ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ธ ํ•ฉ๋ณ‘ ์ •๋ ฌ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ”๋กœ ์‹œ์ž‘ํ• ๊ฒŒ์š”~


๋ถ„ํ•  ์ •๋ณต(Divide and Conquer Algorithm) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€? ๐Ÿก

 

์œ„์—์„œ ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ๋ง์”€๋“œ๋ ธ๋Š”๋ฐ์š”.

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฌด์—‡์ผ๊นŒ์š”?

 

๋ง ๊ทธ๋Œ€๋กœ ์ง€๊ธˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ์ชผ๊ฐœ์„œ(๋ถ„ํ• ) ํ’€์–ด๋‚˜๊ฐ€๋Š”(์ •๋ณต) ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ•ฉ๋ณ‘ ์ •๋ ฌ์ด๋ž€? ๐Ÿคผ‍โ™€๏ธ

 

ํ•ฉ๋ณ‘ ์ •๋ ฌ ๋˜๋Š” ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋น„๊ต ๊ธฐ๋ฐ˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ์ด ์ •๋ ฌ์€ ์•ˆ์ • ์ •๋ ฌ์— ์†ํ•˜๋ฉฐ, ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•˜๋‚˜์ด๋‹ค. 
์กด ํฐ ๋…ธ์ด๋งŒ์ด 1945๋…„์— ๊ฐœ๋ฐœํ–ˆ๋‹ค. - ์œ„ํ‚ค ๋ฐฑ๊ณผ -

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…๋“œ๋ฆฌ๋ฉด, ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฆฌ์ŠคํŠธ๋ฅผ 1๊ฐœ๋งŒ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜์œผ๋กœ ๋ถ„ํ• ํ•œ ๋‹ค์Œ

 

๋‚˜๋ˆ ์ง„ ๋ฆฌ์ŠคํŠธ๋“ค์„ ์„œ๋กœ ๋น„๊ตํ•˜๋ฉฐ ํ•ฉ์ณ๊ฐ€๋Š” ์ •๋ ฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


ํ•ฉ๋ณ‘ ์ •๋ ฌ ๊ณผ์ •

 

๋งŒ์•ฝ 4,1,7,5,3,2,6 ์ด๋ ‡๊ฒŒ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ˆซ์ž๋“ค์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ถ„ํ• 

 

๋จผ์ € ์ด ์ˆซ์ž๋“ค์„ ๋ฐ˜๋“œ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

 

(4,1,7,5) - (3,2,6) ์œผ๋กœ ๋‚˜๋ˆ ์ง€๊ฒ ์ฃ ?

 

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ ์ง„ ์ˆซ์ž๋“ค์„ ํ•˜๋‚˜๋งŒ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๋‚˜๋ˆ ์ค๋‹ˆ๋‹ค.

 

(4,1) - (7,5)     (3,2) - (6) 

 

(4) - (1)   (7)- (5)   (3) - (2)   (6) ์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ ์ง€๊ฒ ์ฃ ?

 

ํ•ฉ๋ณ‘

 

๋จผ์ € ์™ผ์ชฝ๋ถ€ํ„ฐ 4 ์™€ 1์„ ๋น„๊ตํ•ด์„œ ๋” ์ž‘์€ ์ˆซ์ž๋ฅผ ์™ผ์ชฝ์œผ๋กœ ํ•ฉ์ณ์ค๋‹ˆ๋‹ค.

 

1,4 ๊ฐ€ ๋˜๊ฒ ์ฃ ?

 

์ด๋ ‡๊ฒŒ 2๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋น„๊ตํ•ด์„œ ๋” ์ž‘์€ ์ˆซ์ž๋กœ ํ•ฉ๋ณ‘ํ•ด์ค๋‹ˆ๋‹ค.

 

(1,4) - (5,7) - (2,3) - (6)

 

๊ทธ ๋‹ค์Œ 2๊ฐœ์”ฉ ํ•ฉ์ณ์ค€ ์ˆซ์ž๋“ค์„ ๋น„๊ตํ•ด์„œ ๋” ์ž‘์€ ์ˆซ์ž๋กœ ํ•ฉ๋ณ‘ํ•ด์ค๋‹ˆ๋‹ค.

 

1,4 ์™€ 5,7์„ 1,4,5,7๋กœ ํ•ฉ์ณ์ค๋‹ˆ๋‹ค.

 

2,3 ๊ณผ 6์„ 2,3,6์œผ๋กœ ํ•ฉ์ณ์ค๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ 1,4,5,7๊ณผ 2,3,6์„ ํ•ฉ์ณ์ฃผ๋ฉด 1,2,3,4,5,6,7 ๋กœ ์ •๋ ฌ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋˜์‹ค๊ฑฐ์—์š”.

 

์ถœ์ฒ˜:์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋„๊ฐ


์‹œ๊ฐ„๋ณต์žก๋„

 

์šฐ์„  ๋ถ„ํ• ์„ ํ•  ๋•Œ N๊ฐœ๋ฅผ 1๊ฐœ์”ฉ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ ์•ผํ•˜๋ฏ€๋กœ logN์˜ ๋น„์šฉ์ด ๋“ค๊ฒ ์ฃ ?

 

๊ทธ๋ฆฌ๊ณ  ํ•ฉ์ณ์ง€๋Š” ๊ณผ์ •์—์„œ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ์ˆซ์ž๋กœ ํ•ฉ์น˜๊ธฐ ๋•Œ๋ฌธ์— N๋ฒˆ์˜ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค.

 

๊ณ ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” N * logN ์ฆ‰, NlogN ์ž…๋‹ˆ๋‹ค.


์ฝ”๋“œ ๊ตฌํ˜„

 

์ด์ œ ์ด๋ก ์„ ์ดํ•ดํ–ˆ์œผ๋‹ˆ ์ฝ”๋“œ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ด์•ผ๊ฒ ์ฃ ?

 

์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ˆซ์ž๋“ค์ด ๋‹ด๊ธด numbers๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

var numbers:[Int] = [4,1,7,5,3,2,6]

 

์ด์ œ ์ด numbers๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด์ค˜์•ผ๊ฒ ์ฃ ?

 

๋งŒ์•ฝ 1๊ฐœ๋ณด๋‹ค ์ ๋‹ค๋ฉด ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ list๋ฅผ return ํ•ด์ค๋‹ˆ๋‹ค.

 

2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด left์™€ right๋กœ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ ์ค๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  merge๋ฅผ ํ†ตํ•ด์„œ ๋‚˜๋ˆ ์ง„ left์™€ right๋ฅผ ํ•ฉ์ณ์ค€ ๊ฒƒ์„ return ํ•ด์ค๋‹ˆ๋‹ค.

 

private func divide(_ list:[Element]) -> [Element] {
        if list.count <= 1 { return list }
        let mid:Int = list.count/2
        let left:[Element] = Array(list[0..<mid])
        let right:[Element] = Array(list[mid..<list.count])
        return merge(divide(left), divide(right))
    }

 

์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์˜ ์ˆซ์ž๋“ค์„ ๋น„๊ตํ•ด์ฃผ๋ฉด์„œ ๋” ์ž‘์€ ์ˆซ์ž๋“ค๋กœ ์ƒˆ๋กœ์šด list๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ l์ด๋‚˜ r์— ๋‚จ์€ ์ˆซ์ž๋“ค์ด ์žˆ๋‹ค๋ฉด list์— ๋ชจ๋‘ ๋„ฃ์–ด์ฃผ๊ณ  ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

 

private func merge(_ left:[Element],_ right:[Element]) -> [Element] {
        var l:[Element] = left
        var r:[Element] = right
        var list:[Element] = []
        
        while !l.isEmpty && !r.isEmpty {
            if l.first! < r.first! {
                list.append(l.removeFirst())
            }else {
                list.append(r.removeFirst())
            }
        }
        list.append(contentsOf: l+r)
        return list
    }

์ „์ฒด ์ฝ”๋“œ

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€