알고리즘/SWEA

[Java] SWEA 1258번 행렬찾기

컴공맨 2021. 3. 16. 13:38
 

SW Expert Academy

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

swexpertacademy.com


풀이

dfs를 사용하여 문제의 조건을 처리하였습니다.

마지막으로 정답을 출력하기전에 각 사각형의 행과 열이 큰 순으로 만약 같다면 행의 길이가 작은 순이 먼저 정렬되게하여 해결했습니다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;

public class Solution {
	static class Info {
		int r;
		int c;
		
		public Info(int r, int c) {
			this.r = r;
			this.c = c;
		}
	}
	
	public static int N, r, c;
	public static List<Info> answer;
	public static int[][] arr;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder("");
		StringTokenizer st;
		
		int T = Integer.parseInt(br.readLine());
		for (int tc = 1; tc <= T; ++tc) {
			N = Integer.parseInt(br.readLine());
			
			arr = new int[N][N];
			answer = new ArrayList<Info>();
			
			for (int i = 0; i < N; ++i) {
				st = new StringTokenizer(br.readLine(), " ");
				for (int j = 0; j < N; ++j) {
					arr[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			for (int i = 0; i < N; ++i) {
				for (int j = 0; j < N; ++j) {
					r = 0;
					c = 0;
					if (arr[i][j] > 0) {
						dfs(i, j, i, j);
						answer.add(new Info(r, c));
					}
				}
			}
			
			Collections.sort(answer, new Comparator<Info>() {

				@Override
				public int compare(Info o1, Info o2) {
					// TODO Auto-generated method stub
					int diff = (o1.c * o1.r) - (o2.c * o2.r);
					return (diff == 0) ? (o1.r - o2.r) : diff;
				}
				
			});
			
			sb.append("#").append(tc).append(" ").append(answer.size());
			for (Info i : answer) {
				sb.append(" ").append(i.r).append(" ").append(i.c);
			}
			sb.append("\n");
		}
		
		System.out.println(sb);
	}
	
	public static void dfs(int y, int x, int st_y, int st_x) {
		if (y > st_y && arr[y][st_x] == 0) {
			return;
		}
		
		arr[y][x] = -1;
		
		if (y == st_y) {
			c++;
		}
		
		if (x + 1 >= N || (x + 1 < N && arr[y][x + 1] == 0)) {
			r++;
			dfs(y + 1, st_x, st_y, st_x);
		}
		else {
			dfs(y, x + 1, st_y, st_x);			
		}
	}
}

 

pyo7410/Algorithm

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com