구간 합 구하기 5

알고리즘/백준
2024. 10. 1. 14:20
목차
  1. 시도1
  2. 시도2
  3. 코드
  4. 시도3
  5. 코드
728x90

파란색 구간이 구해야하는 구한 합이라면 빨간색 부분과 초록색 부분을 제외하면 된다고 생각

시도1

맨 처음에 가로 구간합, 세로 구간합으로 나눠서 구했음. 

 

(파란색 구간의 누적합 - (빨간색 누적합 + 주황색 누적합 + 빨,주 겹치는 부분)) 으로 구하면 될 줄 알았다

근데 그림에서도 보이다시피 파란색에 끝부분과 주화색 끝 부분도 계산식에 포함돼서 결과가 제대로 나오지 않음

빨간색 점선 부분도 포함

 

시도2

저 양쪽 끝을 포함하지 않도록 하기 위해 행별로 누적합을 구하기로 했다.

코드

import sys
n, m = map(int, input().split())
data = [list(map(int, sys.stdin.readline().rstrip().split())) for _ in range(n)]
#가로형태?로 누적합 구한것
sum_col = [[0] * (n+1) for _ in range(n+1)]
#x1, y1 ~ x1~ y2 / x2, y2 ~ x2, y2
sum_col[1][1] = data[1][1] #초기값 세팅
for i in range(1, n+1):#row
for j in range(1, n+1):#col
# if i == 1 and j == 1: #[0][0]이면 누적합이 본인
# sum_col[i][j] = data[i-1][j-1]
if j == 1: #다음 행으로 이동하면 그 행부터 다시 누적합
sum_col[i][j] = data[i-1][j-1]
else:
sum_col[i][j] = data[i-1][j-1] + sum_col[i][j-1]
for i in range(m):
x1, y1, x2, y2 = map(int, input().split())
sum = 0#파란색 박스
for j in range(1, x2+1): # (x2,y2) 까지 누적합 구하기
sum += sum_col[j][y2]
box1 = 0 # 주황색 박스
for j in range(1, x1):
box1 += sum_col[j][y2]
box2 = 0 #빨간색 박스
for j in range(1, x2+1):
box2 += sum_col[j][y1-1]
overlap_box = 0 #겹치는 박스
for j in range(1, x1):
overlap_box += sum_col[j][y1-1]
print(sum - (box1+box2-overlap_box))

 

시간초과: 원인은 m=100,000이고 x1 = 1000만 되어도 시간초과

 

시도3

생각해보면 빨간색과 주황색을 모두 구할 필요가 없다. 입력으로 주어진 x1, y1 ~ x2, y2구간만 고려하면 됨

코드

import sys
n, m = map(int, input().split())
data = [list(map(int, sys.stdin.readline().rstrip().split())) for _ in range(n)]
#가로형태?로 누적합 구한것
data_sum = [[0] * (n+1) for _ in range(n+1)]
#x1, y1 ~ x1~ y2 / x2, y2 ~ x2, y2
data_sum[1][1] = data[1][1] #초기값 세팅
for i in range(1, n+1):#row
for j in range(1, n+1):#col
if j == 1: #다음 행으로 이동하면 그 행부터 다시 누적합
data_sum[i][j] = data[i-1][j-1]
else:
data_sum[i][j] = data[i-1][j-1] + data_sum[i][j-1]
for i in range(m):
x1, y1, x2, y2 = map(int, input().split())
box1 = 0
for i in range(x1, x2+1):
box1 += data_sum[i][y2]
box2 = 0
for i in range(x1, x2+1):
box2 += data_sum[i][y1-1]
print(box1-box2)
728x90

'알고리즘 > 백준' 카테고리의 다른 글

이친수  (0) 2024.10.15
케빈 베이컨의 6단계 법칙  (3) 2024.10.05
[구현] 소수의 연속합 - 소수 판별 (에라토스테네스의 체)  (0) 2024.08.21
[그리디] 단어 수학  (0) 2024.08.09
이코테 [구현] 백준3190 뱀  (1) 2024.07.20
  1. 시도1
  2. 시도2
  3. 코드
  4. 시도3
  5. 코드
'알고리즘/백준' 카테고리의 다른 글
  • 이친수
  • 케빈 베이컨의 6단계 법칙
  • [구현] 소수의 연속합 - 소수 판별 (에라토스테네스의 체)
  • [그리디] 단어 수학
hapBday
hapBday
hapBday
개발자로 성장하기 위한 기록들
hapBday
전체
오늘
어제
  • 분류 전체보기 (203)
    • CS (12)
      • 컴퓨터네트워크 (11)
      • 운영체제 (0)
      • 분산 시스템 (0)
      • 데이터베이스 (1)
    • Spring (47)
      • Spring 핵심 원리 (13)
      • Spring MVC (15)
      • Spring DB (12)
      • Spring Security (6)
    • JPA (14)
    • 알고리즘 (30)
      • 프로그래머스 (6)
      • 백준 (20)
    • Design Pattern (0)
    • 언어 (5)
      • JAVA (5)
    • ASAC 웹 풀스택 (38)
      • Spring Boot (21)
      • React (0)
      • DevOps (8)
    • 트러블슈팅 (15)
    • DevOps (5)
      • Docker (5)
    • ETC (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

  • 블로그 이전

인기 글

태그

  • MVC
  • JPA
  • 3-layerd 아키텍쳐 패턴
  • currency control
  • x-lock
  • 트랜잭션
  • 인프런
  • spring boot
  • docker
  • cookie
  • docker workflow
  • Session
  • 백준
  • CSRF
  • docker best practices
  • 프로그래머스
  • aws lambda
  • spring security
  • Spring
  • s-lock
  • multi-stage
  • basicerrorcontroller
  • S3
  • 티스토리챌린지
  • 오블완
  • 김영한
  • Java
  • jwt
  • CORS
  • 구현

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
hapBday
구간 합 구하기 5
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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