[프로그래머스 Lv2] 프렌즈4블록

‍csk·2022년 6월 30일
0

알고리즘

목록 보기
10/13

프로그래머스 프렌즈4블록(swift) [LEVEL2]

구현

  • 구현하기

생각회로

  • 정사각형 터트리기
    -> (1,1) 부터 (m-1, n-1) 까지 순차탐색
    -> 왼쪽위 (i-1,j-1), 왼쪽 (i,j-1), 위 (i-1,j), 나 (i,j) 총 네개의 값이 같을경우 , board와 같은 크기의 arr에 1 표시
    -> 1표시 된 경우 "0"으로 바꿔줌
  • 떨어지기
    -> 중력 방향대로 밑에서부터 탐색
    -> 0을 발견 ! -> 거기서부터 맨 위까지 0이 아닌 알파벳 저장
    -> 알파벳을 추가하고, 0을 추가 !
  • 반복

주의사항

  • Index와 변수 끼리의 비교를 하지말자.
  • reversed()를 통한 역순 for문 index 확인

소스코드

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

profile
Developer

0개의 댓글