var (m,n,li) = (0,0,[[Character]]())
func remove()->Int{
var arr = Array(repeating: Array(repeating : 0, count: n), count : m)
var number = 0
for i in 1..<m{
for j in 1..<n{
let (lu,l,u) = (li[i-1][j-1] , li[i-1][j], li[i][j])
if lu == "0" || l == "0" || u == "0"{
continue
}
if li[i][j] == li[i-1][j] && li[i][j] == li[i][j-1] && li[i][j] == li[i-1][j-1]{
arr[i][j] = 1
number += 1
}
}
}
if number > 0{
for i in 1..<m{
for j in 1..<n{
if arr[i][j] == 1{
(li[i][j], li[i-1][j], li[i][j-1], li[i-1][j-1]) = ("0","0","0","0")
}
}
}
}
return number
}
func fall(){
for j in 0..<n{
var flag = false
for i in (0..<m).reversed(){
if flag{
break
}
if li[i][j] == "0"{
flag = true
var (tmp, zeros) = ([Character]() , 0)
for k in (0...i).reversed(){
if li[k][j] == "0"{
zeros += 1
}else{
tmp.append(li[k][j])
}
}
var K = 0
for k in (0...i).reversed(){
if K < tmp.count{
li[k][j] = tmp[K]
K += 1
}else{
li[k][j] = "0"
}
}
}else{
continue
}
}
}
}
func solution(_ M:Int, _ N:Int, _ board:[String]) -> Int {
(m,n) = (M,N)
var ans = 0
for b in board{
li.append(Array(b))
}
while true{
let tmp = remove()
if tmp == 0{
break;
}
fall()
}
for i in 0..<m{
for j in 0..<n{
if li[i][j] == "0"{
ans += 1
}
}
}
return ans
}
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges