๏นฅ

Backjoon 16600. ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ 5 (Python3)

@๋‚จ์ œ์ด ยท 2024๋…„ 07์›” 27์ผ ยท 2๋ถ„
problem_solvingbackjoonbackjoon 16600์‹ค๋ฒ„ 1python

๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/11660


๋ฌธ์ œ ์š”์•ฝ

Nร—N๊ฐœ์˜ ์ˆ˜๊ฐ€ Nร—N ํฌ๊ธฐ์˜ ํ‘œ์— ์ฑ„์›Œ์ ธ ์žˆ๋‹ค. (x1, y1)๋ถ€ํ„ฐ (x2, y2)๊นŒ์ง€ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. (x, y)๋Š” xํ–‰ y์—ด์„ ์˜๋ฏธํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, N = 4์ด๊ณ , ํ‘œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฑ„์›Œ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

image

์—ฌ๊ธฐ์„œ (2, 2)๋ถ€ํ„ฐ (3, 4)๊นŒ์ง€ ํ•ฉ์„ ๊ตฌํ•˜๋ฉด 3+4+5+4+5+6 = 27์ด๊ณ , (4, 4)๋ถ€ํ„ฐ (4, 4)๊นŒ์ง€ ํ•ฉ์„ ๊ตฌํ•˜๋ฉด 7์ด๋‹ค.

ํ‘œ์— ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์ˆ˜์™€ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ์—ฐ์‚ฐ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.


๋ฌธ์ œ ํ’€์ด

์ฒ˜์Œ์—๋Š” ๋ฌธ์ œ๋ฅผ ์ž˜๋ชป ์ดํ•ดํ•ด์„œ ํ•ด๋‹น ๋ฒ”์œ„์— ๋Œ€ํ•ด์„œ๋งŒ ํ•ฉ์„ ๊ตฌํ•ด์ฃผ๋ ค๊ณ  ํ–ˆ์—ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๋งค๋ฒˆ ๊ณ„์‚ฐ์„ ํ•ด์ฃผ๊ฒŒ ๋˜์–ด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

image2


๋ณดํ†ต ์ด๋Ÿด ๋•Œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ํ’€์–ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผํ• ์ง€ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค.

๋งค ๋ฒˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ๋”ํ•ด ํ•ฉ์„ ๊ตฌํ•ด์ค„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์— ๊ตฌํ•œ ํ•ฉ์„ ํ†ตํ•ด์„œ ๋‹ค์Œ ํ•ฉ์„ ๊ตฌํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, (1, 1) ๋ถ€ํ„ฐ (3, 3) ๊นŒ์ง€ ๊ตฌํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ (1, 1) ๋ถ€ํ„ฐ (1, 2) ์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  (1, 1) ๋ถ€ํ„ฐ (1, 3) ์˜ ํ•ฉ์„ ๊ตฌํ•ด์„œ ๋ชจ๋“  ํ•ฉ์„ ๋‹ค ๊ตฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ „์˜ ๊ตฌํ•œ ํ•ฉ์„ ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ํ•ฉ์„ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ํ™”์‹์„ ํ†ตํ•ด ๋ชจ๋“  ์œ„์น˜์—์„œ์˜ ๋ˆ„์  ํ•ฉ์„ ๊ตฌํ•ด์ฃผ์—ˆ๋‹ค.

dp = [[0] * (n+1) for _ in range(n+1)]

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

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ํ™”์‹์— ์˜ํ•ด์„œ ๋ˆ„์  ํ•ฉ์ด ๊ณ„์‚ฐ๋œ๋‹ค.

dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + graph[i-1][j-1]

๋งŒ์•ฝ ์˜ˆ๋ฅผ ๋“ค์–ด, ์ ํ™”์‹์„ ํ†ตํ•ด (3, 3) ์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

image3


์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์œ„์น˜์—์„œ์˜ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ๋ˆ„์ ํ•ฉ์ด ๊ตฌํ•ด์ง„๋‹ค.

image4


๋‹ค์Œ์œผ๋กœ ์›ํ•˜๋Š” ๋ฒ”์œ„์˜ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด์ „์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

if x1 == x2 and y1 == y2:
        result = graph[x1-1][y1-1]
else:
    if x1 == 1:
        result = dp[x2][y2] - dp[x2][y1-1]
    elif y1 == 1:
        result = dp[x2][y2] - dp[x1-1][y2]
    else:
        result = dp[x2][y2] - (dp[x1-1][y2] + dp[x2][y1-1] - dp[x1-1][y1-1])

์ด๋ ‡๊ฒŒ ๊ตฌํ•œ ์ด์œ ๋Š” ์œ„์—์„œ ๊ตฌํ•œ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์„ค๋ช…ํ•ด๋ณด์ž.

์˜ˆ๋ฅผ ๋“ค์–ด, (2, 2) ์—์„œ (3, 4) ๊นŒ์ง€์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด๋ณด์ž.

image5


๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ (3, 3) ์—์„œ (4, 4) ๊นŒ์ง€์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด๋ณด์ž.

image6


์ด๋ ‡๊ฒŒ ๋ˆ„์ ํ•ฉ์„ ํ†ตํ•ด์„œ ํŠน์ • ๋ฒ”์œ„์˜ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.


์ œ์ถœ ๋‹ต์•ˆ

import sys

n, m = map(int, sys.stdin.readline().split())
graph = []

for i in range(n):
    graph.append(list(map(int, sys.stdin.readline().split())))

dp = [[0] * (n+1) for _ in range(n+1)]

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

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