코딩테스트/구름톤 챌린지

[Java] 구름톤 챌린지 2주차 : 구름 찾기 깃발

이덩우 2023. 8. 22. 10:58

- 문제설명

 

- 해결과정

완전탐색 문제이다.

배열의 모든 좌표를 순회하는데 현재 좌표값이 0이라면 상하좌우 + 대각선 총 8방향에서 1이 있는지 검사하고 그 개수를 저장한다.

1의 개수가 K와 같다면, 따로 결과로 내보내줄 result값을 하나 올려준다.

전형적인 완전탐색 문제이다!

 

- 솔루션

import java.io.*;
import java.util.*;
class Main {
	private static int[] dx = {1, -1, 0, 0, 1, -1, 1, -1};
	private static int[] dy = {0, 0, -1, 1, -1, -1, 1, 1};
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());
		
		/*
			입력값 배열로 만들기
		*/
		int[][] board = new int[N][N];
		for(int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j = 0; j < N; j++) {
				board[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		
		/*
			배열 전체를 순회, 값이 0이라면 주변 8개의 박스 중 1의 개수를 센다.
			1의 개수가 K와 같다면 result++;
		*/
		int result = 0;
		int temp = 0;
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				temp = 0;
				if(board[i][j] == 0) {
					for(int k = 0; k < 8; k++) {
						int nextX = j + dx[k];
						int nextY = i + dy[k];
						try {
							if(board[nextY][nextX] == 1) {
								temp++;
							}
						} catch (ArrayIndexOutOfBoundsException e) {}
					}
					if(temp == K) result++;
				}
			}
		}
		
		bw.write(Integer.toString(result));
		bw.flush();
		bw.close();
	}
}