본문 바로가기
프로그래밍/CodeUp

CodeUp[Q_2042] : 소화기가 필요해

by 조원일 2020. 3. 28.
728x90

1. 문제

https://codeup.kr/problem.php?id=2042

 

소화기가 필요해

$n \times n$ 크기의 연구소에서 일하는 광곽이는 잠깐 밥먹으러 갔다온 사이, 연구실에 불이 난 것을 발견했다. 이를 발견한 광곽이는 불을 끄기 위해 연구실에 있던 소화기를 챙겨 불을 끄기로 한다. 광곽이의 소화기는 주변 $k \times k$ 구역의 불을 끌 수 있다. (단, 불이 붙지 않은 경우는 없다.) 연구소에 불이 붙지 않은 부분에서 소화기를 분사했을 때, 불이 가장 많이 꺼지는 행과 열 값을 출력한다.

codeup.kr

[출처 : 코드업(https://codeup.kr/)]

이번문제는 좌표의 값이 0일때 그 좌표의 k 범위안에 있는 1을 더해 가장 큰 좌표를 구하는 문제입니다.

이런한 문제는 n*n배열이 아닌

"(n+(k/2))*(n+(k/2))"배열을 만들어주면 꼭지점과 상관없는 간단한 코트를 작성할수 있습니다.

 

 

2. 풀이방법

STEP 1. x,y좌표와 k가 주어질때 k범위안의 1을 더하는 함수작성
STEP 2. 입력된 좌표를 전부 확인하면서 가장 큰 좌표를 체크

 

 

3. 해답

#include <stdio.h>

int arr[19][19] = { 0, };

int Count(int x, int y, int k) {
	int c = 0;
	// x,y에서 k범위안에 불이 있는곳을 체크
	for (int i = x - (k / 2); i <= x + (k / 2); i++) {
		for (int j = y - (k / 2); j <= y + (k / 2); j++) {
			if (arr[i][j] == 1) c++;
		}
	}

	return c;
}

int main() {
	int n, k;
	int x, y, c, max = 0;

	scanf("%d", &n);
	scanf("%d", &k);

	for (int i = 2; i < n + 2; i++) {
		for (int j = 2; j < n + 2; j++) {
			scanf("%d", &arr[i][j]);
		}
	}
	
	for (int i = 2; i < n + 2; i++) {
		for (int j = 2; j < n + 2; j++) {
			// 해당좌표가 불이나있으면 패스
			if (arr[i][j] == 1) continue;

			c = Count(i, j, k);

			// 가장 불이 많은 곳을체크
			// 불의 개수가 (k*k-1)이면 주변이 불로 둘러싸인 경우
			if (c > max && c < (k*k - 1)) {
				max = c;
				x = i;
				y = j;
			}
		}
	}
	if (max > 0)	printf("%d %d", x - 1, y - 1);
	else printf("119");

	return 0;
}