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

2018 KAKAO BLIND RECRUITMENT[1์ฐจ] ํ”„๋ Œ์ฆˆ4๋ธ”๋ก Swift

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

Problem


 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - [1์ฐจ] ํ”„๋ Œ์ฆˆ4๋ธ”๋ก

ํ”„๋ Œ์ฆˆ4๋ธ”๋ก ๋ธ”๋ผ์ธ๋“œ ๊ณต์ฑ„๋ฅผ ํ†ต๊ณผํ•œ ์‹ ์ž… ์‚ฌ์› ๋ผ์ด์–ธ์€ ์‹ ๊ทœ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ์—…๋ฌด๋ฅผ ๋งก๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ฒˆ์— ์ถœ์‹œํ•  ๊ฒŒ์ž„ ์ œ๋ชฉ์€ ํ”„๋ Œ์ฆˆ4๋ธ”๋ก. ๊ฐ™์€ ๋ชจ์–‘์˜ ์นด์นด์˜คํ”„๋ Œ์ฆˆ ๋ธ”๋ก์ด 2×2 ํ˜•ํƒœ๋กœ 4๊ฐœ๊ฐ€ ๋ถ™

programmers.co.kr

 

Solution


 

๋จผ์ € ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค์€ ํผ์ฆ์ด ์‚ญ์ œ๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  remove Boolean๋ณ€์ˆ˜ ->   var remove = true

 

board ์•ˆ์˜ ๋ฌธ์ž๋ฅผ ์‰ฝ๊ฒŒ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด map์œผ๋กœ ๋ฐ”๊ฟ”์ค€ boards ๋ณ€์ˆ˜ -> var boardsCopy = boards

 

boards์˜ ๊ฐ’์„ ์ €์žฅํ•  boardsCopy ๋ณ€์ˆ˜ -> var boards = board.map{$0.map{String($0)}}

 

๋นˆ์นธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์…€ emptyCount ๋ณ€์ˆ˜ -> var answer = 0

 

1
2
3
4
5
6
7
8
9
10
 
    //board์•ˆ์˜ ์ŠคํŠธ๋ง์„ map์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ด
    var boards = board.map{$0.map{String($0)}}
    //boards์˜ ๊ฐ’์„ ์ €์žฅํ•ด์ค„ ๋ณ€์ˆ˜
    var boardsCopy = boards
    //์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ์•ˆ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ๋ณ€์ˆ˜
    var remove = true
    //์‚ญ์ œ๋œ ์นธ์„ ์„ธ์–ด์ค„ ๋ณ€์ˆ˜
    var answer = 0
    

 

ํผ์ฆ์ด 4๊ฐœ๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€๊ฑด์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„  ํผ์ฆ์˜ ํ•œ์ค„์”ฉ ๋น„๊ตํ•ด๋ณด์•„์•ผํ•ฉ๋‹ˆ๋‹ค. (๋…ธ๋ž€์ƒ‰์œผ๋กœ ์ค„์ณ์ง„๋ถ€๋ถ„์ด ํ•œ์ค„)

 

์ฒซ๋ฒˆ์งธ์ค„๊ณผ ๋‘๋ฒˆ์งธ์ค„ - > ๋‘๋ฒˆ์งธ์ค„๊ณผ ์„ธ๋ฒˆ์งธ์ค„ -> ์„ธ๋ฒˆ์งธ์ค„๊ณผ ๋„ค๋ฒˆ์งธ์ค„...... i-1๊ณผ i๋ฒˆ์งธ์ค„ ์ด๋ ‡๊ฒŒ ๋ง์ด์ฃ !

 

๊ทธ๋ฆฌ๊ณ  ์ค„์— ์žˆ๋Š” ํผ์ฆ์˜ ๊ทธ๋ฆผ์„ ์ฐจ๋ก€๋กœ ํ™•์ธํ•ด์•ผํ•˜๋Š”๋ฐ์š”.

 

i-1๋ฒˆ์งธ์ค„์˜ j-1๋ฒˆ์งธ ์žˆ๋Š” ๊ทธ๋ฆผ๊ณผ i๋ฒˆ์งธ j๋ฒˆ์งธ๊ทธ๋ฆผ์ด ๊ฐ™์€์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ๊ฐ™๋‹ค๋ฉด i-1๋ฒˆ์งธ ์ค„์˜ j๋ฒˆ์งธ์™€ i๋ฒˆ์งธ j๋ฒˆ์งธ ๊ทธ๋ฆผ์ด ๊ฐ™์€์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ์ด๊ฒƒ๋„ ๊ฐ™๋‹ค๋ฉด ์ด์ œ ๊ฐ™์€ ์ค„์— ์žˆ๋Š” j์™€ j-1์˜ ๊ทธ๋ฆผ์ด ๊ฐ™์€์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ™๋‹ค๋ฉด ๋นˆ์นธ์œผ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋นˆ์นธ์œผ๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฌ๋ฉด ๋‹ค์Œ ์ค„์˜ ๋น„๊ต๊ฐ€ ํž˜๋“œ๋ฏ€๋กœ ๋ฏธ๋ฆฌ ๋ณด๋“œ์˜ ์ „์ฒด๊ทธ๋ฆผ์„ ๊ธฐ์–ตํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.(boardsCopy)

 

boards๋Š” ๋นˆ์นธ์œผ๋กœ ๋งŒ๋“ค๊ณ  boardsCopy์™€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด์ฃ !!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 while remove == true {
    remove = false
    answer = 0
    //4๊ฐœ ์ด์ƒ ๊ฐ™์€ ํผ์ฆ์ด ์žˆ๋‹ค๋ฉด ๋นˆ์นธ์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ
    for i in stride(from: m-1, to: 0, by: -1) {
        //boards๋Š” ๊ฐ™๋‹ค๋ฉด ๋นˆ์นธ์œผ๋กœ ๋ฐ”๋€Œ๋ฏ€๋กœ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘” boardsCopy์˜ i-1,i๋กœ ํ•ด์ค€๋‹ค.
        let current = boardsCopy[i-1]
        let before =  boardsCopy[i]
        for j in 1..<n {
            //๋งŒ์•ฝ ๋นˆ์นธ๋„ ์•„๋‹ˆ๊ณ  ์œ„ ์•„๋ž˜ ์นธ์˜ j๋ฒˆ์จฐ ๊ธ€์ž๊ฐ€ ๊ฐ™๋‹ค๋ฉด
            if current[j] != "" && current[j] == before[j]  {
                //์œ„ ์•„๋ž˜ ์นธ j-1๋ฒˆ์งธ์นธ๊ณผ ํ˜„์žฌ์˜ j-1,j๋ฒˆ์งธ ๊ธ€์ž๊ฐ€ ๊ฐ™๋‹ค๋ฉด
                if current[j-1== before[j-1&& current[j] == current[j-1]{
                    remove = true
                    //๊ฐ™์€ 4๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ๋นˆ์นธ์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ
                    (boards[i][j],boards[i-1][j],boards[i][j-1],boards[i-1][j-1])  =  ("","","","")
                }
            }
        }
    }
 

 

๊ทธ๋ฆฌ๊ณค ๋นˆ์นธ๋“ค์„ ๋ฉ”๊พธ๊ธฐ์œ„ํ•ด ๊ทธ๋ฆผ๋“ค์„ ์„ธ๋กœ๋กœ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.(๋นจ๊ฐ„์ƒ‰์ด ์„ธ๋กœ)

 

j๋ฒˆ์งธ์— ์žˆ๋Š” ๊ทธ๋ฆผ๋“ค์„ ์•„๋ž˜์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 

 

emptyCount๋ผ๋Š” ๋นˆ์นธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋‹ด์•„์ค„ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ 

 

๋นˆ์นธ์ด ์•„๋‹ˆ๊ณ  emptyCount๋„ 0์ด๋ผ๋ฉด ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. 

 

๋งŒ์•ฝ ๋นˆ์นธ์ด๋ผ๋ฉด empryCount๋ผ๋Š” ๋นˆ์นธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋Š˜๋ ค์ค๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋นˆ์นธ๋„ ์•„๋‹ˆ๊ณ  emptyCount๋„ 0์ด ์•„๋‹ˆ๋ผ๋ฉด ํ•ด๋‹น j๋ฒˆ์งธ ๊ทธ๋ฆผ์„ ์ค„์„ emptyCount๋งŒํผ 

 

์ด๋™์‹œ์ผœ์ฃผ๊ณ  ์›๋ž˜์žˆ๋˜ i๋ฒˆ์งธ ๊ทธ๋ฆผ์„ ๋นˆ์นธ์œผ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. (boards[i+emptyCount][j] = boards[i][j] , boards[i][j] = "")

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        //์ฒซ๋ฒˆ์งธ ์„ธ๋กœ์ค„๋ถ€ํ„ฐ
        for j in 0..<n {
            //๋นˆ์นธ์„ ์„ธ์–ด์ค„ ๋ณ€์ˆ˜
            var emptyCount = 0
            //๋ฐฐ์—ด์„ ๊ฑฐ๊พธ๋กœ๋ถ€ํ„ฐ ํ™•์ธ
            for i in stride(from: m-1, to: -1, by: -1){
                //boards์˜ ๋ฌธ์ž๊ฐ€ ๋นˆ์นธ์ด ์•„๋‹ˆ๋ฉด
                if boards[i][j] != "" {
                    //๋นˆ์นธ์ด ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋‹ค๋ฉด
                    if emptyCount != 0 {
                    //๋นˆ์นธ๋งŒํผ ์œ„ ๋ฐฐ์—ด๋กœ ๊ฐ’์„ ๋„˜๊ฒจ์ค€๋‹ค.
                    boards[i+emptyCount][i] = boardsCopy[i][j]
                    //์œ„๋กœ ์˜ฌ๋ ค์ค€ ๊ฐ’์€ ๋นˆ์นธ์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ
                    boards[i][j] = ""
                    }
                }else{
                    //boards[b][i] ๋น„์–ด์žˆ๋‹ค๋ฉด emptyCount๋ฅผ 1์ฆ๊ฐ€์‹œ์ผœ์คŒ
                    emptyCount += 1
                }
            }
            //๋นˆ์นธ๋“ค์„ ์ฐจ๋ก€๋กœ ๋”ํ•ด์คŒ
            answer += emptyCount
        }
 

์œ„์™€ ๊ฐ™์ด ๋ชจ๋‘ ๋นˆ์นธ์„ ๋ฉ”๊ฟจ๋‹ค๋ฉด ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋˜‘๊ฐ™์ด ๋ฐ˜๋ณตํ•ด์ค๋‹ˆ๋‹ค.( remove ๋ถˆ๋ฆฐ๊ฐ’์ด true์ผ๋•Œ๊นŒ์ง€ while๋ฌธ์œผ๋กœ ๋ฐ˜๋ณต)

 

๊ทธ๋ฆฌ๊ณ  ํ•œ๊ฐœ๋„ ์‚ญ์ œ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด emptyCount๋ฅผ answer์— ์ฐจ๋ก€๋กœ ๋”ํ•ด์ฃผ๊ณ  ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค. -> return answer

 

Source Code


728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€