문제링크
누적합을 이용한 문제
누적합이 뭐예요??
리스트, 배열을 차곡차곡 누적하는 알고리즘이라고 보면 편할 듯하다.
문제
예제 입력 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
EX :
(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])
'Koala - 5기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[BOJ/c++] 1780 - 종이의 개수 (0) | 2022.02.06 |
---|---|
[BOJ / Python] 2435 - 기상청 인턴 신현수 (0) | 2022.02.06 |
[백준/C++] 알고리즘 17179번 케이크 자르기 (0) | 2022.02.06 |
[BOJ / Swift] 17245 - 서버실 (3) | 2022.02.06 |
[BOJ / C++] 17951 : 흩날리는 시험지 속에서 내 평점이 느껴진거야 (1) | 2022.02.05 |