Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 이진 탐색
- 투포인터 알고리즘
- 1806 백준
- git local remote
- android hilt
- 1753 다익스트라
- 자료구조
- 5582 DP
- 1806 투포인터
- flow buffering
- Coroutine Flow
- 1644 파이썬
- Android Room
- Jetpack Room
- 자바
- 6588 파이썬
- 백준 5582
- 안드로이드 hilt
- 1753 파이썬
- 2096 파이썬
- java
- 1003 파이썬
- 백준 2096
- 5582 파이썬
- 백준 10819
- Android mvp
- 10819 파이썬
- 코루틴 플로우
- 1806 파이썬
- 백준 1644
Archives
- Today
- Total
Gemstone's Devlog
[백준] 1992번: 쿼드트리 (분할정복) 본문
https://www.acmicpc.net/problem/1992
이 문제는 분할정복으로 접근해야 하는 문제이다.
풀이 방법은 다음과 같다.
1. 모두 0이나 1로 되어있지 않은 경우(조건이 만족하지 않은 경우) 4개로 쪼개서 다시 푸는 방식이다.
조건이 만족하지 않는 경우 괄호 "("를 넣고, 4개로 쪼개고 나서 각 처리를 다 하고 나면, 다시 괄호 ")"를 넣는다.
2. 4개로 쪼개는 것은 재귀함수를 호출하여 풀고, 전달 인자로 그 사분면의 가장 왼쪽 위의 좌표와 크기를 넣는다.
3. 조건이 만족하는 경우(모두 0이나 1로 되어있는 경우)는 해당 색상의 값(0이나 1)을 출력해준다.
파이썬 풀이
n = int(input())
graph = [list(map(int, input())) for _ in range(n)]
# devide and conquer 분할정복
def dnc(x, y, n):
check = graph[x][y]
for i in range(x, x + n):
for j in range(y, y + n):
if check != graph[i][j]:
check = -1
break
if check == -1:
print("(", end='')
n = n // 2
dnc(x, y, n) # 1사분면
dnc(x, y + n, n) # 2사분면
dnc(x + n, y, n) # 3사분면
dnc(x + n, y + n, n) # 4사분면
print(")", end='')
elif check == 1:
print(1, end='')
else:
print(0, end='')
dnc(0, 0, n)
'Data Structure & Algorithms' 카테고리의 다른 글
[백준] 5582번: 공통 부분 문자열 (다이나믹 프로그래밍) (0) | 2022.03.31 |
---|---|
[백준] 1806번: 부분합 (투포인터) (0) | 2022.03.29 |
[백준] 2133번: 타일 채우기 (다이나믹 프로그래밍) (0) | 2022.03.28 |
[Codeforces] 768B: Code For 1 (0) | 2022.03.27 |
[Codeforces] 448C: Painting Fence (0) | 2022.03.27 |