구름톤 챌린지 2-7: 구름 찾기 깃발

짱올이·2023년 8월 25일

구름톤 챌린지

목록 보기
6/8
post-thumbnail

문제 7. 구름 찾기 깃발

해당 문제는 행렬에서 문제의 요구 사항을 만족하는 값을 찾는 완전 탐색 문제입니다. 행렬에서의 이동 개념이 필요합니다. 구름 레벨 변형 문제입니다.


  1. 행렬
    게임판의 크기를 입력받고 행렬로 접근해서 문제를 풀어야 한다.

  2. 완전 탐색
    모든 칸을 탐색하며 해당 칸에 대한 근처 8칸에 대해 구름이 있는지 모두 탐색한다.
    해당 칸이 기준이 되고, 탐색할 칸에 대해 이중배열로 좌표를 더하여 구름이 있는지 탐색할 칸의 위치를 찾는다.

int[][] d = {
	{-1, -1}, {-1, 0}, {-1, 1}, 
	{0, -1}, {0, 1},
	{1, -1}, {1, 0}, {1, 1}
};

근처의 8칸 모두를 탐색하기 위해 2중 반복문으로 모두 근처의 위치를 접근하고,
해당 칸이 구름칸(1)이라면 주변의 값을 탐색하지 않아도되므로 if (game[i][j] == 1) { continue; } 조건처리 한다.

for (int i = 1; i < n+1; i++) {
	for (int j = 1; j < n+1; j++) {
		if (game[i][j] == 1) {
			continue;
		}
		int flag = 0;
		for (int l = 0; l < 8; l++) {
			int x = d[l][0] + i;
			int y = d[l][1] + j;
			if (game[x][y] == 1) {
				flag++;
			}
		}
		if (k == flag) {
			result++;
		}
	}
}

구름이 있는 칸이라면 flag++ 깃발을 추가하고, 찾고 싶은 깃발의 값 K가 일치하는지 검사한다.



import java.io.*;
import java.util.*;
class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());

		int[][] game = new int[1005][1005];
		for (int i = 1; i < n+1; i++) {
			StringTokenizer num = new StringTokenizer(br.readLine());
			for (int j = 1; j < n+1; j++) {
				game[i][j] = Integer.parseInt(num.nextToken());
			}
		}
		
		int[][] d = {
			{-1, -1}, {-1, 0}, {-1, 1}, 
			{0, -1}, {0, 1},
			{1, -1}, {1, 0}, {1, 1}
		};
		
		int result = 0;
		for (int i = 1; i < n+1; i++) {
			for (int j = 1; j < n+1; j++) {
				if (game[i][j] == 1) {
					continue;
				}
				int flag = 0;
				for (int l = 0; l < 8; l++) {
					int x = d[l][0] + i;
					int y = d[l][1] + j;
					if (game[x][y] == 1) {
						flag++;
					}
				}
				if (k == flag) {
					result++;
				}
				// System.out.print(game[i][j]+" ");
			}
			// System.out.println();
		}
		System.out.println(result);
		
	}
}

완전 탐색 문제 유형을 처음 익힌거라 이해하는데 시간이 좀 걸렸지만 한번 이해해놓으니 이후에 문제도 잘 풀렸다.
하지만 기본적인 이중배열에 대한 개념이 너무나도 부족하게 느껴져서 다시한번 기초에 대한 중요성을 깨닫게 된 문제.

profile
모르면 알때까지 공부하라고~~!!

0개의 댓글