잡다한 배똥월드

728x90

 

 

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

 

 

 

N×N 크기의 격자판이 있다. 각각의 격자는 비어 있거나(‘.’), 막혀 있다(‘#’). 이때, 막혀 있는 칸들이 하나의 정사각형을 이루는지를 판단하는 프로그램을 작성하라.

[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 격자판의 크기 N (1≤N≤20 이 주어진다. 다음 N개의 줄은 격자판의 배치를 나타내며, 각 줄에는 ‘.’ 또는 ‘#’로만 이루어진 길이가 N인 문자열이 주어진다. 모든 격자판에는 최소 1개 이상의 ‘#’ 칸이 있음이 보장된다.

[출력]
각 테스트 케이스마다 격자판의 막혀 있는 칸들이 하나의 정사각형을 이루면 ‘yes’를, 그렇지 않다면 ‘no’를 출력한다.

 

 

 

 

 

 

 

작성 코드

import java.util.*;
import java.io.*;

class Solution {
	public static void main(String args[]) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
		int T = Integer.parseInt(br.readLine());
        
		for(int test_case = 1; test_case <= T; test_case++) {
			int n = Integer.parseInt(br.readLine());
            
            String[][] map = new String[n][n];
            int firstR = -1;
            int firstC = -1;
            int count = 0;
            String answer = "yes";
            
            for (int i = 0; i < n; i++) {
            	String s = br.readLine();
                String[] arr = s.split("");
                
                map[i] = Arrays.copyOf(arr, arr.length);
                count += s.replace(".", "").length();
                
                if (firstR == -1 && firstC == -1 && s.indexOf("#") != -1) {
                	firstR = i;
                    firstC = s.indexOf("#");
                }
            }
            
            int size = 0;
            
            for (int i = 1; i <= n; i++) {
            	if (i * i == count) {
                    size = i;
                    break;
                }
            }
            
            if (size == 0 || firstR + size > n || firstC + size > n) {
                System.out.printf("#%d %s%n", test_case, "no");
                continue;
            }
            
            loop:
            for (int i = firstR; i < firstR + size; i++) {
                for (int j = firstC; j < firstC + size; j++) {
                    if (!map[i][j].equals("#")) {
                        answer = "no";
                        break loop;
                    }
                }
            }
            
            System.out.printf("#%d %s%n", test_case, answer);
		}
	}
}

 

 

 

 

어차피 #들이 다 붙어있어야 하기 때문에 처음 시작하는 행, 열 좌표를 구했고,

아래의 경우를 예를 들면 가로 세로 길이를 구할 땐 2로 나올 것이다.

근데 첫 시작 지점이 (0, 2)이기 때문에 범위 오류가 나기 때문에

만약에 첫 시작 지점에서 가로 세로로 갈 수 없으면 그냥 no 리턴.

 

 

 

 

 

 

 

모양에 대해서는 여러 경우의 수가 있기 때문에

다양한 모양을 생각해서 코드를 짜야만 했다.

 

 

 

 

 

 

 

 

풀고 난 지금에서야 코드를 보면 간단하다고 생각이 들지만

경우의 수를 생각하는 게 조금 어려웠다....

 

거즘 4번만에 통과한...

 

 

 

 

 

728x90

+ Recent posts