모두가 처음 접하면 같은 과정을 거치는 듯한 문제인 것 같다.
2중 for문으로 생각했다가 아무리 생각해도 시간 초과인데.. 싶으면서 일단 해보고 역시나 시간초과가 나서 풀이를 찾아보는..?
'누적 합' 구현 방식을 이해하고 나면 또 금새 해결된다.
내가 약한 dp풀이가 섞여들어가서 나는 단번에 이해가 된 건 아니었는데 아래 링크 보고 확실히 이해할 수 있었다.
백준/ Silver1 문제 , 백준 파이썬 11660 , 구간 합
백준/ Silver1 문제 , 백준 파이썬 11660 , 구간 합 Check Point ! ( 해당사항 ✓체크 ) 1. 막힘 없이 수월하게 풀린 문제인가? 2. 1시간이내로 풀렸던 문제인가? 3. 1시간 이상 or 며칠을 두고..
bmy1320.tistory.com
위 링크를 읽고 누적합알고리즘 자체랑 누적값 dp테이블 구하는 건 이해가 갔는데
그 테이블 이용해서 값 구할 때 왜 합산 값을 또 안 구하나 헷갈리는거 보니까 완전히 이해 못 한거였다.
아래 걸 읽고 더 깊게 이해가 됐는데
https://ji-musclecode.tistory.com/38
누적합(Prefix Sum / Cumulative Sum) 알고리즘
( 누적합 알고리즘 간단 예제 ) [ 1, 2, 3, 4, 5 ] 로 이루어준 숫자 배열에서 각 구간까지의 합을 구하는 배열 [ 1, 3, 6, 10, 15] 을 구한다고 가정해보면 아래와 같이 2가지로 구할 수 있습니다. [ 첫번째
ji-musclecode.tistory.com
행 and 열 기준으로 그 때까지의 값이 구해진거라고 보면 된다. 그래서 해당 구간 끝값 자체만 빼면 되는 거였다.
import sys
input = sys.stdin.readline
n,m = map(int,input().split())
# 행, 열 각 첫번째 줄은 0으로 비워두기. board자체에서 누적합배열 리셋 위해서.
board = [[0]*(n+1)]+[[0]+list(map(int,input().split())) for _ in range(n)]
# 누적 합 배열 구하기
for i in range(1,n+1):
for j in range(1,n+1):
board[i][j] = board[i][j]+board[i-1][j]+board[i][j-1]-board[i-1][j-1]
# 구간 합 구하기
for _ in range(m):
x1,y1,x2,y2 = map(int,input().split())
print(board[x2][y2]-board[x1-1][y2]-board[x2][y1-1]+board[x1-1][y1-1])
프로그래머스에 있는 더 심화내용 풀어보며 익혀보면 좋을 것 같아 아래 문제도 함께 풀어봤다.
https://school.programmers.co.kr/learn/courses/30/lessons/92344?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'CodingTest > Baekjun Online Judge' 카테고리의 다른 글
[ BOJ / 파이썬 ] 2667 단지 번호 붙이기 (0) | 2022.10.08 |
---|---|
[ BOJ / 파이썬 ] 2583 영역 구하기 (0) | 2022.10.08 |
[ BOJ / 파이썬 ] 13335 트럭을 지나는 트럭 (0) | 2022.10.05 |
[ BOJ / 파이썬 ] 14499 주사위 굴리기 (0) | 2022.10.05 |
[ BOJ / 파이썬 ] 15665 N과M(11) (0) | 2022.08.30 |