코딩테스트

[Swift 알고리즘] 프로그래머스(Lv.2) - 쿼드압축 후 개수 세기

유정주 2022. 5. 3. 18:21
반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "프로그래머스(Lv.2) - 쿼드압축 후 개수 세기" 문제를 풀었습니다.

 


Github

 

GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

github.com

 

문제 링크

 

코딩테스트 연습 - 쿼드압축 후 개수 세기

[[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]] [4,9] [[1,1,1,1,1,1,1,1],[0,1,1,1,1,1,1,1],[0,0,0,0,1,1,1,1],[0,1,0,0,1,1,1,1],[0,0,0,0,0,0,1,1],[0,0,0,0,0,0,0,1],[0,0,0,0,1,0,0,1],[0,0,0,0,1,1,1,1]] [10,15]

programmers.co.kr


풀이

이번 문제는 재귀를 이용하면 쉽게 해결할 수 있습니다.

전형적인 재귀 문제라고 봐도 좋습니다.

 

첫 번째 원소를 확인하고 2차원 배열의 정해진 구간을 탐색하며 다른 원소가 있는지 확인합니다.

만약 다른 원소가 있다면 4분할 하여 재귀 호출합니다.

다른 원소가 없다면 0 혹은 1 카운트를 증가 시킵니다.

 

감사합니다!


전체 코드

import Foundation

var count: [Int] = [0, 0]

func quardZip(_ arr: [[Int]], x: Int, y: Int, w: Int) {
    let firstItem = arr[x][y]
        
    for i in x..<x+w {
        for j in y..<y+w {
            if arr[i][j] != firstItem {
                let halfSize = w / 2
                quardZip(arr, x: x, y: y, w: halfSize)
                quardZip(arr, x: x+halfSize, y: y, w: halfSize)
                quardZip(arr, x: x, y: y+halfSize, w: halfSize)
                quardZip(arr, x: x+halfSize, y: y+halfSize, w: halfSize)
                
                return
            }
        }
    }
    
    count[firstItem] += 1
}

func solution(_ arr:[[Int]]) -> [Int] {
    
    quardZip(arr, x: 0, y: 0, w: arr.count)
    
    return count
}

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형