
2차원 배열의 요소에 대해 상하좌우(총 4칸)의 칸을 확인하고, 해당 탐색 과정에서 다음 동작을 수행한다.
1 N, K = map(int, input().split())
2
3 maps = [[''] * (N + 1) for _ in range(N + 1)]
4 for y in range(1, N + 1):
5 row = input().split()
6 for x in range(1, N + 1):
7 maps[y][x] = row[x - 1]
8
9 scores = [[0] * (N + 1) for _ in range(N + 1)]
10 dirs = [(0, 0), (1, 0), (-1, 0), (0, 1), (0, -1)]
11 max_score = 0
12 for k in range(K):
13 y, x = map(int, input().split())
14 for dy, dx in dirs:
15 ny, nx = y + dy, x + dx
16 if ny in (0, N + 1) or nx in (0, N + 1):
17 continue
18
19 if maps[ny][nx] == '0':
20 scores[ny][nx] += 1
21 elif maps[ny][nx] == '@':
22 scores[ny][nx] += 2
23 max_score = max(max_score, scores[ny][nx])
24
25 print(max_score)
N과 K에 int 자료형 값을 대입한다.
maps에 문제에서 주어진 값(땅의 상태 '0', '@', '#')을 입력한다.
문제에서 좌표가 1~N으로 주어지기 때문에, 편의를 위해 N+1 x N+1 리스트로 만들었다.
땅의 폭탄값을 저장할 scores와 탐색 방향 dirs, 최대 폭탄값 max_score를 초기화한다.
폭탄을 떨어뜨리는 횟수 K번 동안 탐색과 최대값 업데이트를 반복한다.
폭탄이 떨어진 좌표 (y, x)를 입력받는다.
폭탄이 떨어진 칸과 해당 칸의 상하좌우 칸(총 5칸)을 탐색한다. 만약 탐색할 칸 (ny, nx)가 1~N의 범위를 벗어난 경우, 이후 코드를 실행하지 않고 다음 칸으로 넘어간다.
탐색할 칸의 값에 따라 칸의 폭탄값을 변경한다.
탐색할 칸 (ny, nx)의 폭탄값과 최대 폭탄값을 비교하여, 더 큰 값을 최대 폭탄값으로 업데이트한다.
#include <iostream>
using namespace std;
int main() {
int N, K;
cin >> N >> K;
char ground[200][200];
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
cin >> ground[i][j];
}
}
int max_damaged = 0;
int damaged[200][200] = {0};
int dirs[5][2] = {{0, 0}, {-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for (int i = 0; i < K; i++){
int y, x;
cin >> y >> x;
for (int j = 0; j < 5; j++) {
int ny = y - 1 + dirs[j][0], nx = x - 1 + dirs[j][1];
if (ny < 0 || ny == N || nx < 0 || nx == N) continue;
switch (ground[ny][nx]) {
case '#':
continue;
case '@':
damaged[ny][nx] += 2;
break;
default:
damaged[ny][nx] += 1;
}
max_damaged = max(max_damaged, damaged[ny][nx]);
}
}
cout << max_damaged;
return 0;
}

끗