티스토리 뷰
프로그래머스 '쿼드 압축 후 개수 세기' 문제 풀이입니다.
문제 링크
● 문제 간단 설명
주어진 2차원 배열에 대해서 4개의 영역으로 나누었을 때 한 영역 내부에 요소가 모두 1이거나 0일 경우 그 영역을 1이나 0으로 치환한다. 4개의 영역의 크기가 1이 될 때까지 나누는 과정과 치환하는 과정을 반복한다고 할 때 반복이 모두 끝났을 때 0과 1의 개수를 구하는 문제.
● 문제 해결 방향
4개의 영역으로 나누고, 각 영역에 대해서 모든 요소가 1 또는 0인지를 판단하는 과정이 계속 반복되기 때문에 재귀함수를 활용해서 각 영역의 크기가 1이 될 때까지 반복해서 로직을 수행하도록 해주었다.
● 문제 해결 코드
def quadCount(arr):
zeroCount = 0
oneCount = 0
if len(arr) > 1:
halfLen = len(arr) // 2
totalCount = sum(sum(a) for a in arr);
if totalCount == 0:
zeroCount += 1
elif totalCount == len(arr) ** 2 :
oneCount += 1
else :
for rowPart in range(0, len(arr), halfLen):
for colPart in range(0, len(arr), halfLen):
[newZeroCount, newOneCount] = quadCount(list(map(lambda x: x[colPart:colPart + halfLen], arr[rowPart:rowPart + halfLen])))
zeroCount += newZeroCount
oneCount += newOneCount
else:
return [0, 1] if arr[0][0] else [1, 0]
return [ zeroCount, oneCount ]
def solution(arr):
return quadCount(arr)
solution
quadCount() 함수를 통해 나온 결과 값이 리턴되도록 해주었다.
quadCount()
각 영역에 대해서 1, 0의 숫자를 세어주는 함수로써,
영역의 가로, 세로 길이가 1인 경우 1 또는 0을 판단하여 적절한 변수의 수를 올려주었다.
영역의 가로, 세로 길이에 대해서 1이 아닌 경우에는 영역의 값이 모두 동일한지 확인하는 로직(if, elif 부분)을 거치고 아닌 경우(else), 4개의 영역으로 나누어서 quadCount()를 재귀적으로 호출하여 위와 같은 작업을 반복해주었다.
배열 크기에 대해서 2의 거듭제곱 수의 형태를 띄고 있다는 제약 사항 때문에 재귀 함수를 빨리 떠올려서 어렵지 않게 문제를 풀 수 있었다.
배열 크기에 대한 제약 사항이 없었다면 또 엄청 헤맸을지도...?
● 참고
'PYTHON' 카테고리의 다른 글
[프로그래머스/PYTHON] 더 맵게 (0) | 2022.06.27 |
---|---|
[프로그래머스/PYTHON] 가장 큰 정사각형 찾기 (0) | 2022.06.26 |
[프로그래머스/PYTHON] 정수 삼각형 (0) | 2022.06.09 |
[프로그래머스/PYTHON] 가장 긴 팰린드롬 (0) | 2022.06.08 |
[프로그래머스/PYTHON] [3차]방금 그곡 (0) | 2022.06.06 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- SPA
- Vuex
- error
- 알고리즘
- GraphQL
- reactrouter
- v-for
- AxiosInterceptor
- 백준
- SOAP API
- Preloading
- Vue.js
- programmers
- Transpiler
- Repository Pattern
- 문제풀이
- clean code
- python
- webpack
- React
- redux
- 파이썬
- 상호평가
- TypeScript
- js
- bundler
- Vue
- 프로그래머스
- redux-thunk
- React.memo
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함