[Swift/Python] 프로그래머스(Lv2) - 쿼드압축 후 개수 세기

Kerri·2021년 3월 10일
0

코테

목록 보기
11/67

안녕하세요 :)

이 문제는 쿼드트리를 이용해서 푸는 문제입니다.
https://programmers.co.kr/learn/courses/30/lessons/68936

여기서 flag 변수는 체크한 부분을 또 체크했는지를 확인하는 변수 입니다.

** Swift 코드

import Foundation


func solution(_ arr:[[Int]]) -> [Int] {
    let n = arr.count
    
    var zeroCnt = 0
    var oneCnt = 0
    
    func quadTree(_ x: Int, _ y: Int, _ n: Int) {
        let first = arr[x][y]
        
        var flag = false
        
        for i in (x..<x + n) {
            if flag { break }
            
            for j in (y..<y + n) {
                if arr[i][j] != first {
                    quadTree(x, y, n / 2)
                    quadTree(x, y + n / 2, n / 2)
                    quadTree(x + n / 2, y, n / 2)
                    quadTree(x + n / 2, y + n / 2, n / 2)
                    flag = true
                    break
                }
            }
        }
        
        if !flag {
            if arr[x][y] == 0 {
                zeroCnt += 1
            } else {
                oneCnt += 1
            }
        }
    }
    
    quadTree(0, 0, n)
    
    return [zeroCnt, oneCnt]
}

**Python 코드


cnt_zero = 0
cnt_one = 0


def solution(arr):
    global cnt_zero, cnt_one
    n = len(arr)
    
    cnt_zero = 0
    cnt_one = 0

    def quad_tree(x, y, n):
        global cnt_zero, cnt_one
        first = arr[x][y]

        flag = False
        for i in range(x, x + n):
            if flag:
                break

            for j in range(y, y + n):
                if arr[i][j] != first:
                    quad_tree(x, y, n // 2)  # area1
                    quad_tree(x, y + n // 2, n // 2)  # area2
                    quad_tree(x + n // 2, y, n // 2)  # area3
                    quad_tree(x + n // 2, y + n // 2, n // 2)  # area4
                    flag = True
                    break

        if not flag:
            if arr[x][y] == 0:
                cnt_zero = cnt_zero + 1
            else:
                cnt_one += 1

    quad_tree(0, 0, n)

    return [cnt_zero, cnt_one]

위 파이썬 코드에서 solution 함수 밖에 선언되어 있는 cnt_zero, cnt_one 변수를 쓰려면 global 변수로 선언해줘야 합니다.
여기서, global은 전역 스코프 변수를 사용하겠다는 키워드입니다.

global 변수는 왠만해선 쓰면 안되지만 ... 함수 호출할때 파라미터값으로 전달하기가 복잡해져서 썼습니다.


이미지 출처 : https://hcnoh.github.io/2019-01-30-python-namespace

파이썬은 블럭 단위({...})의 스코프가 아닙니다.

변수의 스코프
변수의 이름으로 그 변수가 가리키는 엔티티를 찾을 수 있는 영역의 범위를 말합니다.

파이썬의 스코프

파이썬에서의 블럭은 다른 언어와 달리 조금 특별한데, 파이썬의 블럭은 “특별한 기능 단위의 경계”를 표시하기 보다는 “프로그램 수행 흐름의 분기점”에 그대로 일치하기 때문입니다. 파이썬에서는 블럭단위의 스코프는 존재하지 않고, 파이썬에서 변수는 그저 지역 변수와 전역 변수만이 존재할 뿐입니다.

참고한글:
파이썬의 이름공간과 변수의 스코프

profile
안녕하세요 !

0개의 댓글