5549 행성 탐사

정민용·2023년 5월 7일

백준

목록 보기
187/286

문제

상근이는 우주선을 타고 인간이 거주할 수 있는 행성을 찾고 있다. 마침내, 전 세계 최초로 인간이 거주할 수 있는 행성을 찾았다. 이 행성은 정글, 바다, 얼음이 뒤얽힌 행성이다. 상근이는 이 행성에서 거주 할 수 있는 구역의 지도를 만들어 지구로 보냈다.

상근이가 보내온 지도는 가로 Ncm, 세로 Mcm 직사각형 모양이다. 지도는 1cm 크기의 정사각형으로 나누어져 있고, 각 구역의 지형이 알파벳으로 표시되어 있다. 지형은 정글, 바다, 얼음 중 하나이며, 정글은 J, 바다는 O, 얼음은 I로 표시되어 있다.

지구에 있는 정인이는 조사 대상 영역을 K개 만들었다. 이때, 각 영역에 정글, 바다, 얼음이 각각 몇 개씩 있는지 구하는 프로그램을 작성하시오.

# 5549
import sys
input = lambda: sys.stdin.readline().strip()

# 1. arr_j, arr_o, arr_i
# 2. sum_j, sum_o, sum_i
# 3. k-count

m, n = map(int, input().split())
k = int(input())
arr = [list(input()) for _ in range(m)]

# 1. arr_j, arr_o, arr_i
arr_j = [[0] * n for _ in range(m)]
arr_o = [[0] * n for _ in range(m)]
arr_i = [[0] * n for _ in range(m)]

for i in range(m):
    for j in range(n):
        if arr[i][j] == "J":
            arr_j[i][j] = 1
        elif arr[i][j] == "O":
            arr_o[i][j] = 1
        else:
            arr_i[i][j] = 1
            
# 2. sum_j, sum_o, sum_i
sum_j = [[0] * (n+1) for _ in range(m+1)]
sum_o = [[0] * (n+1) for _ in range(m+1)]
sum_i = [[0] * (n+1) for _ in range(m+1)]

for i in range(1, m+1):
    for j in range(1, n+1):
        sum_j[i][j] = arr_j[i-1][j-1] + sum_j[i-1][j] + sum_j[i][j-1] - sum_j[i-1][j-1]
        sum_o[i][j] = arr_o[i-1][j-1] + sum_o[i-1][j] + sum_o[i][j-1] - sum_o[i-1][j-1]
        sum_i[i][j] = arr_i[i-1][j-1] + sum_i[i-1][j] + sum_i[i][j-1] - sum_i[i-1][j-1]
        
# 3. k-count
for _ in range(k):
    a, b, c, d = map(int, input().split())
    a, b = a-1, b-1
    num_j = sum_j[c][d] - sum_j[c][b] - sum_j[a][d] + sum_j[a][b]
    num_o = sum_o[c][d] - sum_o[c][b] - sum_o[a][d] + sum_o[a][b]
    num_i = sum_i[c][d] - sum_i[c][b] - sum_i[a][d] + sum_i[a][b]
    
    print(num_j, num_o, num_i)

백준 5549 행성 탐사

0개의 댓글