9oormthon 완전 탐색 4일차: 폭탄 구현하기(2)

PEA은하·2023년 8월 24일
post-thumbnail

Problem

문제 설명

2차원 배열의 요소에 대해 상하좌우(총 4칸)의 칸을 확인하고, 해당 탐색 과정에서 다음 동작을 수행한다.

  1. 요소의 값에 따라 다른 증가량 적용
  2. 전체 요소 값의 최대값을 업데이트



Submitted Code


Python

 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)

Line 1

NKint 자료형 값을 대입한다.

Line 3-7

maps에 문제에서 주어진 값(땅의 상태 '0', '@', '#')을 입력한다.
문제에서 좌표가 1~N으로 주어지기 때문에, 편의를 위해 N+1 x N+1 리스트로 만들었다.

Line 9-11

땅의 폭탄값을 저장할 scores와 탐색 방향 dirs, 최대 폭탄값 max_score를 초기화한다.

Line 12

폭탄을 떨어뜨리는 횟수 K번 동안 탐색과 최대값 업데이트를 반복한다.

Line 13

폭탄이 떨어진 좌표 (y, x)를 입력받는다.

Line 14-17

폭탄이 떨어진 칸과 해당 칸의 상하좌우 칸(총 5칸)을 탐색한다. 만약 탐색할 칸 (ny, nx)가 1~N의 범위를 벗어난 경우, 이후 코드를 실행하지 않고 다음 칸으로 넘어간다.

Line 19-22

탐색할 칸의 값에 따라 칸의 폭탄값을 변경한다.

  • 탐색할 칸의 값이 '0'이면, 칸의 폭탄값을 1만큼 올린다.
  • 탐색할 칸의 값이 '@'이면, 칸의 폭탄값을 2만큼 올린다.

Line 23

탐색할 칸 (ny, nx)의 폭탄값과 최대 폭탄값을 비교하여, 더 큰 값을 최대 폭탄값으로 업데이트한다.

C++

#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;
}

Challenge Review


0개의 댓글