BOJ 5549(python) : 행성 탐사
문제링크
누적합을 이용한 문제
누적합이 뭐예요??
그냥 리스트, 배열을 차곡차곡 누적하는 알고리즘이라고 보면 편할 듯하다.
문제
예제 입력 1
4 7
4
JIOJOIJ
IOJOIJO
JOIJOOI
OOJJIJO
3 5 4 7
2 2 3 6
2 2 2 2
1 1 4 7
예제 출력 1
1 3 2
3 5 2
0 1 0
10 11 7
(3,5) (4,7) 사이에 있는 J,I,O의 갯수를 출력
Solution
누적합을 저장할 osum,jsum,isum 배열을
맵 배열(arr)보다 1씩 크게 만들기
arr[i-1][j-1] == J 이면
jsum[i][j] +=1 하고
jsum[i][j] = jsum[i][j-1] + jsum[i-1][j] - jsum[i-1][j-1] + jsum[i][j]
더해준다.
전체소스
import sys
n,m = map(int,sys.stdin.readline().split())
k = int(sys.stdin.readline())
arr = list()
jsum,osum,isum = [[0]*(m+1) for _ in range(n+1)],[[0]*(m+1) for _ in range(n+1)],[[0]*(m+1) for _ in range(n+1)]
for i in range(n):
arr.append(list(sys.stdin.readline()))
for i in range(1,n+1):
for j in range(1,m+1):
place = arr[i-1][j-1]
if place == 'O':
osum[i][j] +=1
if place == 'J':
jsum[i][j] +=1
if place == 'I':
isum[i][j] +=1
jsum[i][j] = jsum[i][j-1] + jsum[i-1][j] - jsum[i-1][j-1] + jsum[i][j]
osum[i][j] = osum[i][j-1] + osum[i-1][j] - osum[i-1][j-1] + osum[i][j]
isum[i][j] = isum[i][j-1] + isum[i-1][j] - isum[i-1][j-1] + isum[i][j]
for _ in range(k):
a,b,c,d = map(int,sys.stdin.readline().split())
print(jsum[c][d] - jsum[c][b-1] - jsum[a-1][d] + jsum[a-1][b-1],end=' ')
print(osum[c][d] - osum[c][b-1] - osum[a-1][d] + osum[a-1][b-1],end=' ')
print(isum[c][d] - isum[c][b-1] - isum[a-1][d] + isum[a-1][b-1])
Author And Source
이 문제에 관하여(BOJ 5549(python) : 행성 탐사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cksgodl/BOJ-5549python-행성-탐사저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)