๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

[Swift] 2019 KAKAO WINTER INTERNSHIP ํ˜ธํ…” ๋ฐฉ ๋ฐฐ์ •

by Fomagran ๐Ÿ’ป 2022. 2. 20.
728x90
๋ฐ˜์‘ํ˜•

Problem

 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํ˜ธํ…” ๋ฐฉ ๋ฐฐ์ •

 

programmers.co.kr


Solution

 

1. ์—ฐ์†๋œ ๋ฐฉ๋“ค์˜ ์‹œ์ž‘๊ณผ ๊ธธ์ด๋ฅผ ์ €์žฅํ•ด ๋†“์„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

 

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ํˆฌ์ˆ™์„ ์›ํ•˜๋Š” ๋ฐฉ์ด ์ค‘๋ณต๋˜์—ˆ์„ ๋•Œ ํ•ด๋‹น ๋ฐฉ๋ณด๋‹ค ํฌ๋ฉด์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐฉ์„ ์ฐพ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— 

 

์—ฐ์†๋œ ๋ฐฉ์˜ ๊ธธ์ด์™€ ์‹œ์ž‘๋œ ๋ฐฉ์˜ ์œ„์น˜๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด 10๊ฐœ์˜ ๋ฐฉ ์ค‘ 2,3,4,5 ๊ฐ€ ์ด๋ฏธ ์ฐจ์žˆ๋‹ค๋ฉด ์‹œ์ž‘๋œ ๋ฐฉ์˜ ์œ„์น˜๋Š” 2์ด๊ณ  ์—ฐ์†๋œ ๋ฐฉ์˜ ๊ธธ์ด๋Š” 4์ž…๋‹ˆ๋‹ค.

 

๊ณ ๋กœ 2,3,4,5 ์ค‘์— ์ค‘๋ณต๋œ ๋ฐฉ์ด ์žˆ๋‹ค๋ฉด 2(์‹œ์ž‘๋œ ๋ฐฉ์˜ ์œ„์น˜) + 4(์—ฐ์†๋œ ๋ฐฉ์˜ ๊ธธ์ด) = 6์ด๋ฏ€๋กœ 6๋ฒˆ ๋ฐฉ์— ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

class Room {
    var root:Int64,length:Int64
    init(root:Int64,length:Int64) {
        self.root = root
        self.length = length
    }
}

 

2. ๋ฐฉ์ด ๋น„์–ด์žˆ๊ณ  ์™ผ์ชฝ ๋ฐฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

 

ํˆฌ์ˆ™๋  ๋ฐฉ์ด ๋น„์–ด์žˆ๊ณ , ์™ผ์ชฝ ๋ฐฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ํˆฌ์ˆ™๋  ๋ฐฉ๊ณผ ์™ผ์ชฝ ๋ฐฉ์„ ์—ฐ๊ฒด์‹œ์ผœ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, ํ˜„์žฌ ํˆฌ์ˆ™๋  ๋ฐฉ์˜ ์‹œ์ž‘ ๋ฒˆํ˜ธ๋ฅผ ์™ผ์ชฝ ๋ฐฉ์˜ ์‹œ์ž‘ ๋ฒˆํ˜ธ๋กœ ๋ฐ”๊พธ๊ณ  ์—ฐ์†๋œ ๋ฐฉ์˜ ๊ธธ์ด๋ฅผ ์™ผ์ชฝ ๋ฐฉ์˜ ๊ธธ์ด์— +1(ํ˜„์žฌ ๋ฐฉ)์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค๋‹ˆ๋‹ค.

 

func updateLeftSide(_ n:Int64) {
    dic[n-1]!.length += 1
    dic[n] = dic[n-1]!
}

 

3. ๋ฐฉ์ด ๋น„์–ด์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ ๋ฐฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

 

ํˆฌ์ˆ™๋  ๋ฐฉ์ด ๋น„์–ด์žˆ๊ณ , ์˜ค๋ฅธ์ชฝ ๋ฐฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ํˆฌ์ˆ™๋  ๋ฐฉ์„ ์‹œ์ž‘์œผ๋กœ ํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ ๋ฐฉ๊ณผ ์—ฐ๊ฒฐ์‹œ์ผœ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋ฐฉ์˜ ๊ธธ์ด๋ฅผ + 1(ํ˜„์žฌ ๋ฐฉ)์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค๋‹ˆ๋‹ค.

 

func updateRightSide(_ n:Int64) {
    dic[n+1]!.length += 1
    dic[n+1]!.root = n
    dic[n] = dic[n+1]!
}

 

4. ๋ฐฉ์ด ๋น„์–ด์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ๊ณผ ์™ผ์ชฝ์ด ๋ชจ๋‘ ๋น„์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

 

ํˆฌ์ˆ™๋  ๋ฐฉ์ด ๋น„์–ด์žˆ๊ณ  ์™ผ์ชฝ ๋ฐฉ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ฐฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ํ˜„์žฌ ๋ฐฉ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ฐฉ์˜ ์‹œ์ž‘์„ ์™ผ์ชฝ ๋ฐฉ์˜ ์‹œ์ž‘ ๋ฒˆํ˜ธ ๋ฐ”๊พธ๊ณ ,

 

์™ผ์ชฝ๋ฐฉ์˜ ๊ธธ์ด์™€ ์˜ค๋ฅธ์ชฝ ๋ฐฉ์˜ ๊ธธ์ด + 1(ํ˜„์žฌ๋ฐฉ)์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

func updateBothSide(_ n:Int64) {
    let newLength = dic[n-1]!.length + dic[n+1]!.length + 1
    dic[n-1]!.length = newLength
    dic[n+1]! = dic[n-1]!
    dic[n] = dic[n-1]
}

 

5. ๋ฐฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

 

๋ฐฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋Š” 1๋ฒˆ์—์„œ ์ •ํ•œ ๊ทœ์น™๋Œ€๋กœ ๋ฐฉ์˜ ์œ„์น˜๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ƒˆ๋กญ๊ฒŒ ์ •ํ•ด์ง„ ๋ฐฉ์˜ ์œ„์น˜ ๋˜ํ•œ 2,3,4๋ฒˆ์œผ๋กœ ์–‘ ์ชฝ์˜ ๋ฐฉ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ค€ ๋’ค ์—…๋ฐ์ดํŠธ ํ•ด์ค๋‹ˆ๋‹ค.

 

func updateOverlap(_ n:Int64) {
    let newNumber = dic[n]!.root + dic[n]!.length
    check(newNumber)
}

 

* check

func check(_ n:Int64) {
    if dic[n] == nil {
        if dic[n-1] != nil && dic[n+1] != nil{
        updateBothSide(n)
        }else if dic[n-1] != nil {
         updateLeftSide(n)
        }else if dic[n+1] != nil {
         updateRightSide(n)
        }else {
            dic[n] = Room(root: n, length: 1)
        }
        result.append(n)
    }else {
        updateOverlap(n)
    }
}

Source Code

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€