[백준] 11660 구간 합구하기 -> 다이나믹 프로그래밍으로 효율적인 연산!

2022. 2. 13. 17:17·Algorithm (PS)
728x90

 

우선 정말 단순하게 for문 이중으로 돌린 나의 코드 .. 날먹시도 실패 역시 시간초과 난다

# 11660 구간 합구하기

n, m = map(int, input().split())
graph = []
for _ in range(n):
    graph.append(list(map(int, input().split())))


for _ in range(m):
    x1, y1, x2, y2 = map(int, input().split())
    result = 0
    for i in range(x1-1, x2):
        for j in range(y1-1, y2):
            result += graph[i][j]
    print(result)

 

DP로 풀어야 시간 초과가 나지 않는다. 그리고 파이썬 특성상, input() 대신 sys.stdin.readline() 로 입력값을 받아야 시간초과를 면할 수 있다. 

예제에서 (2,2) ~ (3,4) 까지의 구간 합을 구한다. 

구간합을 효율적으로 구하기 위해서 노랗게 칠한 부분에서 분홍색 부분과 파란색 부분을 빼준 후, 두번 빼주게 되는 영역을 한번 다시 더해주면 된다. 전에도 이런 DP 유형 문제가 있었는데, 좌표 계산에 주의하자 ! 

즉, 다시 정리하면 현재 (i,j) 에 (1,1)~ (i,j) 미리 계산된 구간합 데이터가 있어야 한다. 

(1,1) ~ (x2, y2) 의 구간 합 : array[x2][y2] 

(1,1) ~ (x1 y1-1) 파란색 구간 : array[x2][y1-1]

(1, 1) ~ (x1-1, y2) 핑크색 구간 : array[x1-1][y2]

겹치는 부분 : array[x1-1][y1-1]

# 11660 구간 합구하기
import sys

n, m = map(int, sys.stdin.readline().split())
graph = [[0]*(n+1)]
for _ in range(n):
    graph.append([0] + list(map(int, sys.stdin.readline().split())))


# column
for i in range(1, n+1):
    for j in range(1, n):
        graph[i][j+1] += graph[i][j]

# row
for j in range(1, n+1):
    for i in range(1, n):
        graph[i+1][j] += graph[i][j]

for _ in range(m):
    x1, y1, x2, y2 = map(int, sys.stdin.readline().split())
    result = graph[x2][y2] - graph[x1-1][y2] - graph[x2][y1-1] + graph[x1-1][y1-1]
    print(result)

 

 

 

728x90

'Algorithm (PS)' 카테고리의 다른 글

[백준/삼성기출] 17144 미세먼지 안녕! - 구현구현구현문제  (0) 2022.02.15
[백준] 10610 in Python : 시간초과를 위해 Greedy를 떠올리자  (0) 2022.02.15
[백준] 9466 텀프로젝트 : 다익스트라로 왕복하기  (0) 2022.02.10
[백준] 11657 타임머신 : Bellman-Ford 알고리즘 그자체인 문제 !  (0) 2022.02.08
[백준] 13458번 시험감독 in Python  (0) 2022.02.08
'Algorithm (PS)' 카테고리의 다른 글
  • [백준/삼성기출] 17144 미세먼지 안녕! - 구현구현구현문제
  • [백준] 10610 in Python : 시간초과를 위해 Greedy를 떠올리자
  • [백준] 9466 텀프로젝트 : 다익스트라로 왕복하기
  • [백준] 11657 타임머신 : Bellman-Ford 알고리즘 그자체인 문제 !
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • BFS
  • python
  • AWS
  • 백준
  • 클라우드
  • dp
  • 리눅스
  • 운영체제
  • 파이썬
  • 데이터엔지니어
  • 알고리즘
  • dfs
  • 백트래킹
  • Kubernetes
  • 데이터브릭스
  • 카카오코딩테스트
  • Swift
  • Databricks
  • 코딩테스트
  • linux
  • ansible
  • Leetcode
  • SPARK
  • 프로그래머스
  • EC2
  • 쿠버네티스
  • docker
  • 스파크
  • 데이터엔지니어링
  • 빅데이터

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준] 11660 구간 합구하기 -> 다이나믹 프로그래밍으로 효율적인 연산!
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.