티스토리 뷰
문제
1992번: 쿼드트리
첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1≤N ≤64의 범위를 가진다. 두 번째 줄부터는 길이 N 의 문자열이 N 개 들어온다. 각 문자열은 0 또는
www.acmicpc.net
문제 상황
- 0과 1로 이루어진 2차원 배열을 압축하며 압축이 불가능할 경우 4분할하여 작업을 반복한다.
해결 전략
- 재귀를 이용하여 주어진 조건을 분할정복한다. 요소가 전부 한가지로 되어있으면 괄호가 없이 해당 숫자를 출력하고 0과 1이 모두 존재하면 다시 4분할하며 작업을 반복한다. 이 때, 괄호를 넣어주어야 한다.
1. 모든 요소를 검사하며 0행 0열의 값을 기준으로 다른 값이 하나라도 나오면 4분할을 진행한다. 4분할을 진행할 때에 결과에 괄호를 쳐준다.
2. 만약 모든 요소가 같다고 나오면 괄호없이 그냥 결과를 return해준다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
from sys import stdin
input = stdin.readline
N = int(input()) # 1<=N<=64 범위의 2의 제곱수
video = [list(map(int, list(input().strip()))) for _ in range(N)]
result = "" # 결과
def compress(arry): # 2차원 배열을 압축해주는 함수
global result
standard = arry[0][0] # 기준점
for i in range(len(arry)):
for j in range(len(arry[0])):
if arry[i][j] != standard: # 다른게 존재하면 사분할
result += "("
quad(arry)
result += ")"
return None
result += str(standard)
def quad(arry): # 4분할하는 함수
n = len(arry)//2
for i in range(2):
for j in range(2):
compress([row[j*n:(j+1)*n] for row in arry[i*n:(i+1)*n]])
compress(video)
print(result)
|
cs |
해설
- 압축을 확인하며 만약 모든 요소가 같으면 하나의 요소로 압축해주는 함수 compress와 다른 요소가 있을 경우
해당 배열을 4분할 해주는 함수 quad를 이용해서 해결했다. global로 변수를 선언하여 분할시에만 괄호를 쳐주고 그 분할된 값으로 다시 compress 한다.
새로 학습한 것 & 실수
- input()의 결과물을 list처리하면 \n이 생긴다. strip 작업이 필요하다.
- numpy없이 2차원배열을 slicing 하기 위해서는 행을 먼저 slicing 해주고 그 값을 대상으로 다시 slicing한 배열을 만들어주면 된다.(코드 21번째 줄)
- 너무 쉬운문제인데 다 풀어놓고 처음에 video 리스트를 2차원이 아닌 3차원으로 받아서 하루동안 고민했다.. 진짜 말도 안되는 실수이다. 입력이 잘못됬다고 의심하지를 않았다..
'알고리즘 학습 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 - 병든 나이트 (1783) [Python] (0) | 2020.10.20 |
---|---|
백준 알고리즘 - 암호코드 (2011) [Python] (0) | 2020.10.19 |
백준 알고리즘 - 종이의 개수 (1780) [Python] (0) | 2020.10.16 |
백준 알고리즘 - 배열 합치기 (11728) [Python] (0) | 2020.10.16 |
백준 알고리즘 - 공유기 설치 (2110) [Python] (0) | 2020.10.15 |
- Total
- Today
- Yesterday
- 파이썬알고리즘인터뷰#4장
- 토마토#백준알고리즘#Python
- 순열사이클#BOJ#Python
- 백준 알고리즘#BackTracking
- Brackets#Stacks and Queues#Codility#Python
- 나무자르기#BOJ#이분탐색#Python
- django#slicing
- 배열합치기#분할정복#BOJ#Python
- N으로 표현#DP#Programmers#Python
- 쿼드트리#BOJ#분할정복#Python
- API#lazy#
- django
- 병든 나이트#BOJ#탐욕법#Python
- 섬의개수#백준알고리즘#Python
- Triangle#Sorting#Codility#Python
- 미로 탐색#백준알고리즘#Python
- PassingCars#Codility#Python
- 랜선자르기#이분탐색#BOJ#Python
- Distinct#Codility#Python
- 리모컨#완전탐색#BOJ#Python
- Swift#Tuples#Range
- 암호코드#dp#BOJ#Python
- 텀 프로젝트#백준알고리즘#Python
- 종이자르기#분할정복#BOJ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- 터틀비치#리콘#xbox#controller
- 반복수열#백준알고리즘#Python
- filter#isalnum#lower
- 날짜 계산#BOJ#완전탐색#Python
- 공유기 설치#BOJ#이분탐색#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |