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번만에 통과한...
'코딩테스트 > 삼성SW역량테스트' 카테고리의 다른 글
[Java] 삼성 SW 역량 테스트 - 9658번 유효숫자 표기 (D3 / 하) (0) | 2022.03.17 |
---|