MUKER_DEV with iOS

[swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - [1์ฐจ] ํ”„๋ Œ์ฆˆ4๋ธ”๋ก ๋ณธ๋ฌธ

๐Ÿค– ์•Œ๊ณ ๋ฆฌ์ฆ˜/programmers

[swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - [1์ฐจ] ํ”„๋ Œ์ฆˆ4๋ธ”๋ก

MUKER 2023. 4. 12. 13:23
 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr


๋‚˜์˜ ํ’€์ด

func solution(_ m:Int, _ n:Int, _ board:[String]) -> Int {
    var blocks = board.map { $0.map { String($0) } }
    let searchY = [0,1,1]
    let searchX = [1,0,1]
    var erased = [(Int,Int)]()
    
    repeat {
        erased = []
        
        for cycleY in (0..<m) { // ๊ฐ™์€ ๋ชจ์–‘์˜ 2*2๋ธ”๋ก ๊ตฌํ•˜๊ธฐ
            for cycleX in 0..<n {
                if blocks[cycleY][cycleX] == " " { continue }
                var same = 0
                
                for i in 0..<3 {
                    let newY = searchY[i] + cycleY
                    let newX = searchX[i] + cycleX
                    guard newY >= 0 && newY < m && newX >= 0 && newX < n else { continue }
                    let now = blocks[cycleY][cycleX]
                    let new = blocks[newY][newX]
                    if now == new { same += 1 }
                }
                if same >= 3 {
                    erased.append((cycleY,cycleX))
                }
                
            }
        }
        
        for i in erased { // ๊ฐ™์€ ๋ชจ์–‘์˜ ๋ธ”๋ก " "๋กœ ๋งŒ๋“ค๊ธฐ
            blocks[i.0][i.1] = " "
            for j in 0..<3 {
                let y = searchY[j] + i.0
                let x = searchX[j] + i.1
                blocks[y][x] = " "
            }
        }
        
        for cycleY in (0..<m-1).reversed() { // " "๋ธ”๋ก ์œ„๋กœ ์˜ฌ๋ฆฌ๊ธฐ
            for cycleX in 0..<n {
                var count = 0
                while blocks[cycleY+1+count][cycleX] == " " {
                    blocks[cycleY+1+count][cycleX] = blocks[cycleY+count][cycleX]
                    blocks[cycleY+count][cycleX] = " "
                    count += 1
                    if cycleY+1+count > m-1 { break }
                }
            }
        }
    }
    while erased.count != 0;
    return blocks.map { $0.filter { $0 == " " }.count }.reduce(0,+)
}