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

[Swift] 2021 KAKAO INTERNSHIP ํ‘œํŽธ์ง‘

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

Problem

 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํ‘œ ํŽธ์ง‘

8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z"] "OOOOXOOO" 8 2 ["D 2","C","U 3","C","D 4","C","U 2","Z","Z","U 1","C"] "OOXOXOOO"

programmers.co.kr


Solution

ํ•ด๋‹น ๋ฌธ์ œ๋Š” Linked List ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

1. 0๋ถ€ํ„ฐ n๊นŒ์ง€ ์ž๊ธฐ ์ด์ „์˜ ์ˆซ์ž์™€ ๋‹ค์Œ ์ˆซ์ž๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„๋†“์Šต๋‹ˆ๋‹ค.

 

func setLinkedList(n:Int) {
    for i in 0..<n {
        linkedList.append([i-1,i,i+1])
    }
}

 

(์ •์„์ธ Linked List๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ œ ๋ฐฉ์‹๋Œ€๋กœ ๋งŒ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค.)

 

2. ํ–‰์„ ์œ„ or ์•„๋ž˜๋กœ ์ด๋™ํ•  ๋•Œ ์„ ํƒ๋œ index๋ฅผ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.(D X or U X)

 

์•„๋ž˜์™€ ๊ฐ™์ด ํ˜„์žฌ ์ˆซ์ž์˜ ์ „์„ past๋กœ ๋‹ค์Œ์„ next๋กœ ํ‘œ์‹œํ•˜๊ณ 

 

x๋งŒํผ ํ–‰์„ ์ด๋™ํ•ด์ค๋‹ˆ๋‹ค.

 

func past(_ index:Int) -> Int {
    return linkedList[index][0]
}

func next(_ index:Int) -> Int{
    return linkedList[index][2]
}

func moveColumn(x:Int,isUp:Bool){
    for _ in 0..<x {
        if isUp {
            selectedIndex = past(selectedIndex)
        }else {
            selectedIndex = next(selectedIndex)
        }
    }
}

 

3. ํ–‰์ด ์‚ญ์ œ๋˜์—ˆ์„๋•Œ linkedList๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ณ  ์‚ญ์ œ๋œ index๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ 1 - 3 - 5๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ๊ณ  3์ด ์‚ญ์ œ๋˜์—ˆ๋‹ค๋ฉด 1 - 5 ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด์•ผ๊ฒ ์ฃ ?

 

(0 1 3 - 1 3 5 - 3 5 6 ๊ณผ ๊ฐ™์ด ์ €์žฅ๋˜์–ด ์žˆ์„๊ฑฐ์—์š”)

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‚ญ์ œ๋œ ์ „ ์ˆซ์ž์˜ ๋‹ค์Œ ์ˆซ์ž๋ฅผ ์‚ญ์ œ๋œ ๋‹ค์Œ ์ˆซ์ž๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  (0 1 3 -> 0 1 5)

 

์‚ญ์ œ๋œ ๋‹ค์Œ ์ˆซ์ž์˜ ์ „ ์ˆซ์ž๋ฅผ ์‚ญ์ œ๋œ ์ „ ์ˆซ์ž๋กœ ์—ฐ๊ฒฐํ•ด์ค๋‹ˆ๋‹ค. ( 3 5 6 -> 1 5 6)

 

๊ทธ๋ฆฌ๊ณค ๋‚˜์ค‘์— ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด์„œ ์‚ญ์ œ๋œ Index๋ฅผ removeHistory์— ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

 

func removeColumn() {
    changeLinkedList(selected: selectedIndex)
    removeHistory.append(selectedIndex)
    if next(selectedIndex) == linkedList.count {
        selectedIndex = past(selectedIndex)
    }else {
        selectedIndex = next(selectedIndex)
    }
}

 

4. ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์‚ญ์ œ๋œ index๋ฅผ ๋ณต๊ตฌ์‹œ์ผœ์ฃผ๊ณ  ๊ทธ์— ๋งž๊ฒŒ linkedList๋ฅผ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

 

๋ณต๊ตฌ๋˜๋Š” ์ˆซ์ž์˜ ์ „ ์ˆซ์ž์˜ ๋‹ค์Œ ์ˆซ์ž๋ฅผ ํ˜„์žฌ ๋ณต๊ตฌ๋˜๋Š” ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ 

 

๋ณต๊ตฌ๋˜๋Š” ์ˆซ์ž์˜ ๋‹ค์Œ ์ˆซ์ž์˜ ์ „ ์ˆซ์ž๋ฅผ ํ˜„์žฌ ๋ณต๊ตฌ๋˜๋Š” ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

func restoreColumn() {
    let restore = removeHistory.removeLast()
    if past(restore) >= 0 {
        linkedList[past(restore)][2] = restore
    }
    if next(restore) <= linkedList.count - 1 {
        linkedList[next(restore)][0] = restore
    }
}

 

5. n๊ฐฏ์ˆ˜๋งŒํผ O๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  removeHistory์˜ index๋ฅผ X๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

๋ฐ”๋€ ๋ฐฐ์—ด์„ joined ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

 

 var result = Array(repeating: "O", count: n)
    
    for r in removeHistory {
        result[r] = "X"
    }
    
    return result.joined()

Source Code

 


P.S

 

์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ๋ญ ์ด๋ ‡๊ฒŒ ์‰ฌ์›Œ? ํ•˜๋ฉด์„œ ํ’€์—ˆ๋Š”๋ฐ... ์—ญ์‹œ๋‚˜ ํšจ์œจ์„ฑ์—์„œ ์ „๋ถ€ ๋‹ค ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค...

 

๊ณ„์† ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ์‹œํ‚ค๋ฉด์„œ ํ•ด๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค.

 

๊ฒฐ๊ตญ ์นด์นด์˜ค ํ™ˆํŽ˜์ด์ง€๋กœ ๊ฐ€์„œ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ Linked List๋กœ ํ’€์–ด์•ผํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

๊ทธ๋™์•ˆ Linked List๋ฅผ ํ•œ๋ฒˆ๋„ ์•ˆ์จ๋ด์„œ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผํ• ์ง€ ๋ง‰๋ง‰ํ–ˆ๋Š”๋ฐ ๊ทธ๋ƒฅ ๋ฐฐ์—ด์— ์ „ ์ˆซ์ž์™€ ๋‹ค์Œ ์ˆซ์ž๋ฅผ

 

๋‹ด์•„๋†“์œผ๋‹ˆ๊น ์–ด๋Š์ •๋„ ๊ตฌํ˜„์€ ๋๋‹ค.

 

๋‚˜์ค‘์— Linked List๋ฅผ Swift๋กœ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊ณต๋ถ€ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€