PS

[λ°±μ€€] 16507 μ–΄λ‘μš΄ 건 λ¬΄μ„œμ›Œ with Python

ν˜•μ€€_It's 2021. 9. 12. 22:35
728x90
λ°˜μ‘ν˜•

πŸ“Œ BOJ 16507 μ–΄λ‘μš΄ 건 λ¬΄μ„œμ›Œ

πŸ’‘ 쑰건 및 풀이

  1. 사진 크기λ₯Ό μ˜λ―Έν•˜λŠ” 1 <= R, C <= 1000
  2. 사진 μΌλΆ€λΆ„μ˜ 밝기 평균을 μ•Œμ•„λ³Ό 개수 Q
  3. Q개의 각 μ€„μ—λŠ” μ‚¬μ§„μ˜ 일뢀뢄을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ 두 꼭짓점을 μ˜λ―Έν•˜λŠ” μ •μˆ˜ r1, c1, r2, c2 κ°€ μ£Όμ–΄μ§„λ‹€.
    (1 ≤ r1 ≤ r2 ≤ R, 1 ≤ c1 ≤ c2 ≤ C)
  4. λˆ„μ ν•© 문제
  5. Q개의 각 쀄에 μ£Όμ–΄μ§„ μ‚¬μ§„μ—μ„œ 두 점 (r1, c1)κ³Ό (r2, c2)λ₯Ό κΌ­μ§“μ μœΌλ‘œ ν•˜λŠ” μ§μ‚¬κ°ν˜•μ˜ 밝기 평균을 좜λ ₯ν•œλ‹€.
  6. 평균은 μ •μˆ˜ λ‚˜λˆ—μ…ˆμœΌλ‘œ λͺ«λ§Œ μ·¨ν•œλ‹€.

πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

from sys import stdin

r, c, q = map(int, stdin.readline().split())
pic = [[0] * (c + 1)]
for i in range(r):
    sum_list = [0]
    data = list(map(int, stdin.readline().split()))
    sum_list.append(data[0])
    for i in range(1, c):
        sum_list.append(sum_list[-1] + data[i])
    pic.append(sum_list)

for _ in range(q):
    a, b, c, d = map(int, stdin.readline().split())
    addr = [(a, b), (c, d)]
    addr.sort(key=lambda x: x[0])
    res = 0

    knife = (abs(addr[0][0]-addr[1][0]) + 1) * (abs(addr[0][1]-addr[1][1]) + 1)
    for i in range(addr[0][0], addr[1][0] + 1):
        res += pic[i][addr[1][1]] - pic[i][addr[0][1] - 1]

    print(res // knife)

πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

예제

5 6 1
4 1 3 4 9 5
1 2 8 7 5 5
8 1 2 5 3 2
1 5 3 4 2 5
5 2 1 2 3 5
2 2 4 5

μ‹€ν–‰κ²°κ³Ό

3

⌨️ 문제 풀이

  1. λˆ„μ ν•© λ¬Έμ œλ‹€.
  2. 꼭지점을 μ˜λ―Έν•˜λŠ” μ •μˆ˜κ°€ 1λΆ€ν„° μ‹œμž‘λ˜κΈ°μ— 인덱슀 μ—λŸ¬λ₯Ό μ‘°μ‹¬ν•΄μ•Όν•œλ‹€.
    κ·Έλž˜μ„œ λ‚˜λŠ” (R + 1) * (C + 1) 크기릐 배열을 λ§Œλ“€μ–΄ μ½”λ“œλ„ λ‹¨μˆœν™” μ‹œμΌ°λ‹€.
  3. μž…λ ₯ 받은 R * C 크기의 데이터λ₯Ό 배열에 λ„£κ³  λˆ„μ ν•©μ„ ꡬ해 배열에 λ„£μ–΄μ€€λ‹€.
  4. 꼭지점 μ’Œν‘œλ₯Ό μž…λ ₯λ°›μ•„ xμ’Œν‘œμ˜ 크기λ₯Ό μ˜€ν””μ°¨μˆœμœΌλ‘œ μ •λ ¬μ‹œμΌ°λ‹€.
    κ°€μž₯ μ™Όμͺ½μ— μœ„μΉ˜ν•˜κ³  μžˆλŠ” μ’Œν‘œλ₯Ό 찾으렀고 ν–ˆλ‹€.
  5. μ§μ‚¬κ°ν˜•μ˜ 크기λ₯Ό μ•Œμ•„μ•Ό λˆ„μ ν•©μ„ μ΄μš©ν•΄ 찾은 밝기의 합도 λ‚˜λˆŒ 수 μžˆλ‹€.
    κ·Έλž˜μ„œ μ •λ ¬ μ‹œν‚¨ μ’Œν‘œλ₯Ό μ‚¬μš©ν•΄ μ§μ‚¬κ°ν˜•μ˜ 크기λ₯Ό κ³„μ‚°ν–ˆλ‹€.
    (abs(addr[0][0]-addr[1][0]) + 1) * (abs(addr[0][1]-addr[1][1]) + 1)
  6. λ°°μ—΄μ˜ 각 κ°€λ‘œμ€„λ§ˆλ‹€ λ”°λ‘œ 계산을 ν•΄μ£Όμ—ˆλ‹€.
    λˆ„μ ν•©μ˜ μ„±μ§ˆμ€ 예λ₯Ό λ“€μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
    [4, 5, 8, 12, 21, 26] 의 배열이 μžˆμ„ λ•Œ, λ°°μ—΄μ˜ λ‘λ²ˆμ§Έ μ›μ†ŒλΆ€ν„° λ„€λ²ˆμ§Έ μ›μ†Œμ˜ 합을 κ΅¬ν•˜λ €κ³ ν•œλ‹€.
    κ·Έλ ‡λ‹€λ©΄ λ„€λ²ˆμ§Έ μ›μ†Œμ—μ„œ 첫번째 μ›μ†Œμ˜ 값을 λΉΌμ£Όλ©΄ κ΅¬ν•˜λ €λŠ” 값이 λœλ‹€.

πŸ’Ύ λŠλ‚€μ 

  • λˆ„μ ν•©μ˜ κ°œλ…κ³Ό 원리, μ„±μ§ˆμ„ μ•„λ₯΄λ°”μ΄νŠΈ μΆœκ·Όν•˜λ©΄μ„œ μ§€ν•˜μ² μ—μ„œ λ³Έ 것이 큰 도움이 λ˜μ—ˆλ‹€.
  • 인덱슀 μ—λŸ¬κ°€ μ‰½κ²Œ λ°œμƒν•  수 μžˆμ„ 것 κ°™λ‹€λŠ” 생각이 λ“€μ–΄ λ‹€λ₯Έ 풀이도 μƒκ°ν•΄λ³΄μ•˜μ§€λ§Œ 큰 도움은 λ˜μ§€ μ•Šμ•˜λ‹€.
λ°˜μ‘ν˜•