[SWEA][D3][#10989] 폭격 작전

작성:    

업데이트:

카테고리:

태그: , ,

출처

학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.


문제

A국은 적국과 오랜 기간 전쟁을 하고 있는 중이다. A국은 비밀리에 적군 주둔 지역에 대한 폭격 작전을 수행하려고 한다. 이번 작전에는 새로 개발한 십자 폭탄을 사용할 계획이다.

십자 폭탄은 처음 폭발된 위치에서 상하좌우 네 방향으로 폭발력이 미친다. 폭발이 미치는 범위는 폭발력에 비례해서 증가한다.

그림 1은 4 x 4 영역에 대해 예제이다. 각 셀의 숫자는 적군의 수를 의미한다. 폭발력 2 인 십자 폭탄이 (1행, 1열)에 투하된 경우이다. 총 6명의 적군이 피해를 입는다.


그림 1, 2 생략


그림 2는 5 x5 영역에서 2 개의 십자 폭탄이 투하된 경우이다. 두 폭탄의 최초 폭발 위치와 폭발력은 다음과 같다.

1> (1행, 2열) | 폭발력 = 2
2> (2행, 1열) | 폭발력 = 1

그림 2에서 파랗게 색칠된 곳이 최초 폭발 위치이고, 노랗게 색칠된 곳이 폭탄의 폭발 범위에 해당한다. 폭탄의 폭발 범위에 위치한 적군의 수는 총 26명이 된다.

폭탄의 폭발 범위는 지도의 경계를 벗어날 수도 있다. 폭발 범위가 경계를 벗어나면 폭발력은 사라진다.

폭탄의 폭발 위치에 해당하는 행과 열의 값은 항상 0 에서 N-1 사이이고, 폭탄의 폭발력은 1에서 5 사이의 값이다.

NxN 영역에 주둔한 적군의 수가 주어 지고, M 개의 폭탄이 투하되는 위치와 폭발 범위가 주어질 때, 피해를 입는 적 군의 총 수를 계산해보자.


입력

  • 첫 줄에 테스트케이스 수가 주어진다.
  • 다음으로 지도의 크기 N(1<= N <= 30) 과 폭탄의 수 M(<= 10) 이 주어진다.
  • 다음으로 적군 주둔 지역에 대한 정보가 N개의 줄에 공백으로 구분된 N개의 정수 값으로 주어진다.
  • 다음 M개의 줄에 폭탄의 폭발 위치(행과 열)와 폭발 범위가 주어진다. 폭발 범위는 1이상 5이하의 값이다.


출력

  • ‘#’ 과 테스트 케이스 번호를 출력하고 피해를 입는 적군의 총 수를 출력한다.


예제

입력

3
4 1
0 2 1 3
1 0 0 1
2 0 2 0
3 2 2 2
1 1 2
4 2
3 2 0 3
3 0 3 0
1 0 0 2
0 3 3 3
2 1 2
0 1 2
5 2
2 4 3 1 3
4 0 2 3 2
2 0 3 4 3
1 3 4 3 1
3 0 3 3 4
1 2 2
2 1 1


출력

#1 6
#2 14
#3 26


My Sol

def damage(N, mat2, bumb):
    [br, bc, bp] = bumb
    # 세로 피해
    for r in range(br - bp, br + bp + 1):
        if (0 <= r < N):
            mat2[r][bc] += 1
    # 가로 피해
    for c in range(bc - bp, bc + bp + 1):
        if (0 <= c < N):
            mat2[br][c] += 1
    # 반환
    return mat2

# 입력
tcs = int(input())
for tc in range(1, tcs+1):
    # 입력2
    N, B_num = map(int, input().split())
    mat = [list(map(int, input().split())) for _ in range(N)]
    mat2 = [[0]*N for _ in range(N)]
    B = [list(map(int, input().split())) for _ in range(B_num)]

    # 포격 범위 계산
    for bumb in B:
        mat2 = damage(N, mat2, bumb)

    # 피해 계산
    result = 0
    for i in range(N):
        for j in range(N):
            if mat2[i][j] > 0:
                result += mat[i][j]

    print(f'#{tc} {result}')

앞서 한 색칠하기와 비슷한 개념이라고 보면 되겠다. 입력이 복잡하기 때문에 잘 처리해주고, 각 폭탄에 대한 정보를 parameter로 전달하는 damage() 함수를 제작하여 2차원 배열에 피해 범위를 계산하였다. mat2 2차원 배열은 최초에 mat의 크기만큼 0으로 초기화한 배열이다. 여기에 폭탄의 좌표와 파워에 따라 영향을 미치는 범위를 for문을 이용해 적정 인덱스 내에서 칸마다 1을 더해주었다. 1이 있다면 중첩하지 않기 위한 조건문은 굳이 넣지 않았다. 후에 0이 아닌 지역은 폭탄에 의한 피해 지역으로 감안하면 되기 때문이다.

이후 mat2의 모든 칸에 대해 순회하며 0이 아닌 때의 좌표를 mat에 대입하여 해당 위치의 값을 합계 변수에 더해주면 된다. 이렇게 모두 더해진 변수를 출력하면 되겠다.


결과

PASS

댓글남기기