차곡차곡

[BOJ/Python, Java] 백준 1992번 - 쿼드트리 본문

CS/Algorithm

[BOJ/Python, Java] 백준 1992번 - 쿼드트리

sohy 2023. 8. 1. 16:25

백준 #1992 쿼드트리

 

1992번: 쿼드트리

첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또

www.acmicpc.net

 

Python ver.

n = int(input())
grid = [list(input()) for _ in range(n)]

result = []
size = n
def calc(i, j, size):
  if same(i, j, size):
    result.append(grid[i][j])
    return
  else:
    size //= 2
    result.append("(")
    calc(i, j, size)  # 제1사분면
    calc(i, j + size, size)  # 제2사분면
    calc(i + size, j, size)  # 제3사분면
    calc(i + size, j + size, size)  # 제4사분면
    result.append(")")
  
def same(i, j, size):
  ch = grid[i][j]
  for x in range(size):
    for y in range(size):
      dx, dy = i + x, j + y
      if ch != grid[dx][dy]:
        return False
  return True


calc(0, 0, n)
for i in range(len(result)):
  print(result[i], end="")

 

Java ver.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException; 

public class Main  {
	static int n;
	static String[][] map;
	static String result = "";
	
	public static void calc(int i, int j, int size) {
		if (isSame(i, j, size)) {
			result = result + map[i][j];
			return;
		} else {
			size /= 2;
			result = result + '(';
			calc(i, j, size);  // 제1사분면
			calc(i, j + size, size);  // 제2사분면
			calc(i + size, j, size);  // 제3사분면
			calc(i + size, j + size, size);  // 제4사분면
			result = result + ')';
			
		}
	}
	
	public static boolean isSame(int i, int j, int size) {
		String ch = map[i][j];
		int dx, dy;
		for (int x = 0; x < size; x++) {
			for (int y = 0; y < size; y++) {
				dx = i + x;
				dy = j + y;
				if (!ch.equals(map[dx][dy])) {
					return false;
				}
			}
		}
		return true;
	}
	
	public static void main(String[] args) throws IOException {
		
		// 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		n = Integer.parseInt(br.readLine());
		map = new String[n][n];
		for (int i = 0; i < map.length; i++) {
			String[] line = br.readLine().split("");
			for (int j = 0; j < map.length; j++) {
				map[i][j] = line[j];
			}
		}
		
		
		calc(0, 0, n);
		System.out.println(result);
		
		
	}  // end of main
}  // end of class

 

 

  • input으로 들어온 배열에 0 또는 1만 있는지 isSame 함수로 검사한다.
    • 0과 1이 모두 있다면 배열을 4분할 하여 재귀 함수를 통해 각 사분면을 또 검사한다.
    • 0 또는 1만 있다면 해당 위치의 배열은 0 또는 1로 압축
Comments