[BOJ] 주지수 15724번 C++

2024. 3. 22. 19:04· Algorithm
목차
  1. 코드

 

문제

네모 왕국의 왕인 진경대왕은 왕국의 영토를 편하게 통치하기 위해서 1X1의 단위 구역을 여러 개 묶어서 하나의 거대 행정구역인 주지수(州地數, 마을의 땅을 셈)를 만들 예정이다. 진경대왕은 주지수를 만들기 위해서 일정한 직사각형 범위 내에 살고 있는 사람 수를 참고 자료로 쓰고 싶어한다.

진경대왕은 굉장히 근엄한 왕이기 때문에 당신에게 4개의 숫자로 직사각형 범위를 알려줄 것이다.

예를 들어, 위와 같이 사람이 살고 있다고 가정할 때 <그림 1>의 직사각형 범위의 사람 수를 알고 싶다면 진경대왕은 네 개의 정수 1 1 3 2를 부를 것이다. 마찬가지로 <그림 2>는 1 1 1 4, <그림 3>은 1 1 4 4가 될 것이다.

진경대왕을 위하여 이 참고 자료를 만들어내는 프로그램을 작성해보자.

입력

첫째 줄에 영토의 크기 N, M(1 ≤ N, M ≤ 1,024)이 주어진다.

다음 N개의 줄에는 M개의 정수로 단위 구역 내에 살고 있는 사람 수가 주어진다. 각 단위 구역 내에 살고 있는 사람 수는 100명 이하이며, 각 단위 구역 별 최소 1명의 사람은 살고 있다.

그 다음 줄에는 진경대왕이 인구 수를 궁금해하는 직사각형 범위의 개수 K(1 ≤ K ≤ 100,000)가 주어진다.

다음 K개의 줄에는 네 개의 정수로 직사각형 범위 x1, y1, x2, y2가 주어진다(x1 ≤ x2, y1 ≤ y2).

출력

K개의 줄에 순서대로 주어진 직사각형 범위 내에 살고 있는 사람 수의 합을 출력한다.

 

 

 

접근 방식

 

최대 시간이 1초 이므로 K 번째마다 매버 누적합을 구하면 시간 초과가 뜬다

따라서 DP를 사용해 접근할 수 있다

 

DP를 사용해 누적합을 구하는데 이때

DP[i][j]는 DP[i-1][j] + DP[i][j-1] - DP[i-1][j-1] + mat[i][j] 이다

오른쪽 위 대각선 값이 DP[i-1][j] 와 DP[i][j-1]에 의해 두번 계산 되므로 그 값을 빼주어야 한다는 점!

 

그 후 K를 입력받고 직사각형 범위의 누적합을 구해주면 되는데

이때 누적합을 구할 때도

(x1,y1) ~ (x2,y2)의 누적합에서 x1,y1는 항상 1,1이 아니므로

직사각형이 아닌 부분을 제외해주어야 한다.

 

예를들어, (2,2)~ (4,4)까지의 누적합을 구할 때

사진에서 DP[4][4]는 직사각형1의 누적합과 직사각형2의 누적합을 빼고 두개의 겹치는 부분인 직사각형3의 누적합을 더해주면 된다

 

즉, 누적합 = DP[x2][y2] - DP[x1-1][y2] + DP[x2][y1-1] - DP[x-1][y-1]로 구하면 된다!

 

코드

 

#include<bits/stdc++.h>
using namespace std;

int mat[1026][1026];
int dp[1026][1026];
int N,M,K;

int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>N>>M;
    for(int i=1; i<=N; i++){
        for(int j=1; j<=M; j++) {
            cin>>mat[i][j];
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + mat[i][j];
        }
    }


    cin>>K;
    while(K--) {
        int x1, y1, x2, y2;
        cin>>x1>>y1>>x2>>y2;
        int sum = dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1];
        cout<<sum<<'\n';
    }

    

}

'Algorithm' 카테고리의 다른 글

[BOJ] 수들의 합 4 2015번 C++  (0) 2024.03.26
[BOJ] 귀찮아 (SIB) 14929번 C++  (0) 2024.03.25
[BOJ] 행복 유치원 13164번 C++  (2) 2024.03.22
[BOJ] 강의실 배정 11000번 C++  (0) 2024.03.22
[BOJ] 잃어버린 괄호 1541번 C++  (0) 2024.03.22
  1. 코드
'Algorithm' 카테고리의 다른 글
  • [BOJ] 수들의 합 4 2015번 C++
  • [BOJ] 귀찮아 (SIB) 14929번 C++
  • [BOJ] 행복 유치원 13164번 C++
  • [BOJ] 강의실 배정 11000번 C++
따봉치치
따봉치치
따봉치치
김치치의개발블로그
따봉치치
전체
오늘
어제
  • 분류 전체보기 (359)
    • 면접질문 (4)
    • CS (50)
    • FE (116)
      • Javascipt (16)
      • Typescipt (6)
      • React (16)
      • CSS (5)
      • Nextjs (1)
      • 리뷰 (70)
    • Algorithm (181)
    • ETC (3)
      • Bootcamp (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • TOPCIT
  • C++
  • react
  • 데이터베이스
  • 알고리즘
  • Fe
  • 그리디
  • 그래프 탐색
  • 모던 자바스크립트 딥다이브
  • javascript
  • 탐욕 알고리즘
  • 우선순위 큐
  • 자료구조
  • 투 포인터
  • 자바스크립트
  • Greedy
  • dp
  • 리액트
  • 완전탐색
  • 백트래킹
  • 누적합
  • 모던 리액트 딥다이브
  • 문자열
  • BFS
  • 스택
  • CS
  • BOJ
  • typescript
  • Stack
  • 백준

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
따봉치치
[BOJ] 주지수 15724번 C++
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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