ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฌธ์
๋ฌธ์ ํ์ด
๋ฌธ์ ๋ฅผ ์ ํ๊ณ ๋์, ์ด๊ฒ ๋ฌด์จ ๋ง์ด์ง?๐ ํ๋ฉฐ, ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ์ด๋ณด์๋ค. ํ๋์ ๊ตฌ์ญ(r, c)์ ๊ธฐ์ค์ผ๋ก `r, c, d1, d2`์ ๋ฐ๋ผ 5๋ฒ ์ ๊ฑฐ๊ตฌ์ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋ค. ์ ์ ํ ๊ฒฝ๊ณ๋ฅผ ์กฐ์ ํ์ฌ, ์ ๊ฑฐ๊ตฌ๋ง๋ค ์ต๋ํ ๊ณตํํ๊ฒ ์ธ์์ด ๋๋์ด์ง๋๋ก ํด์ผ ํ๋ ๋ฌธ์ ์ด๋ค.
- ๊ธฐ์ค์ (x, y)์ ๊ฒฝ๊ณ์ ๊ธธ์ด d1, d2๋ฅผ ์ ํ๋ค. (d1, d2 ≥ 1, 1 ≤ x < x+d1+d2 ≤ N, 1 ≤ y-d1 < y < y+d2 ≤ N)
- ๋ค์ ์นธ์ ๊ฒฝ๊ณ์ ์ด๋ค.
- (x, y), (x+1, y-1), ..., (x+d1, y-d1)
- (x, y), (x+1, y+1), ..., (x+d2, y+d2)
- (x+d1, y-d1), (x+d1+1, y-d1+1), ... (x+d1+d2, y-d1+d2)
- (x+d2, y+d2), (x+d2+1, y+d2-1), ..., (x+d2+d1, y+d2-d1)
- ๊ฒฝ๊ณ์ ๊ณผ ๊ฒฝ๊ณ์ ์ ์์ ํฌํจ๋์ด์๋ ๊ณณ์ 5๋ฒ ์ ๊ฑฐ๊ตฌ์ด๋ค.
- 5๋ฒ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋์ง ์์ ๊ตฌ์ญ (r, c)์ ์ ๊ฑฐ๊ตฌ ๋ฒํธ๋ ๋ค์ ๊ธฐ์ค์ ๋ฐ๋ฅธ๋ค.
- 1๋ฒ ์ ๊ฑฐ๊ตฌ: 1 ≤ r < x+d1, 1 ≤ c ≤ y
- 2๋ฒ ์ ๊ฑฐ๊ตฌ: 1 ≤ r ≤ x+d2, y < c ≤ N
- 3๋ฒ ์ ๊ฑฐ๊ตฌ: x+d1≤ r ≤ N, 1 ≤ c < y-d1+d2
- 4๋ฒ ์ ๊ฑฐ๊ตฌ: x+d2< r ≤ N, y-d1+d2 ≤ c ≤ N
์์ ๊ฐ์ด ๋ฌธ์ ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ฐ๋ผ, ๊ฒฝ๊ณ ๊ตฌ์ญ์ ํ๊ธฐํ๊ธฐ, ๊ฒฝ๊ณ ๊ตฌ์ญ์ ๋๋จธ์ง ์์ญ์ 1๋ฒ, 2๋ฒ, 3๋ฒ, 4๋ฒ ์ ๊ฑฐ๊ตฌ๋ก ์ ํํ ํ ์ต๋ ์ต์ ๊ฐ์ ์ฐจ๋ฅผ ๊ณ์ฐํด์ฃผ๋ฉด ๋๋ค. ์ฆ, ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ๋์ ์ง์ (r, c)๋ฅผ ์ ํํ ํ, ๊ฒฝ๊ณ ๊ฒฝ๊ณ ๊ตฌ์ญ์ ๋ฐ๋ผ 5๋ฒ ๊ตฌ์ญ์ ์ค์ ํ๊ณ , ๊ทธ ์ธ์ ๋๋จธ์ง ์์ญ์ ๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค.
์ฝ๋
from sys import stdin, maxsize
FIRST, SECOND, THIRD, FOURTH = 0, 1, 2, 3
def calculate(row, col, d1, d2):
global total, answer
zone = [0] * 4
# ์ธ๋ฑ์ค์ ๋ง๊ฒ 1์ฉ ์ถ๊ฐ
temp = [[0] * (N + 1) for _ in range(N + 1)]
temp[row][col] = 5
# d1 = 2 d2 = 2
for i in range(1, d1 + 1):
# 1๋ฒ ๊ฒฝ๊ณ : (x, y), (x+1, y-1), ..., (x+d1, y-d1)
temp[row + i][col - i] = 5
# 4๋ฒ ๊ฒฝ๊ณ : (x+d2, y+d2), (x+d2+1, y+d2-1), ..., (x+d2+d1, y+d2-d1)
temp[row + d2 + i][col + d2 - i] = 5
for i in range(1, d2 + 1):
# 2๋ฒ ๊ฒฝ๊ณ : (x, y), (x+1, y+1), ..., (x+d2, y+d2)
temp[row + i][col + i] = 5
# 3๋ฒ ๊ฒฝ๊ณ : (x+d1, y-d1), (x+d1+1, y-d1+1), ... (x+d1+d2, y-d1+d2)
temp[row + d1 + i][col - d1 + i] = 5
# 1๋ฒ ์ ๊ฑฐ๊ตฌ: 1 ≤ r < x+d1, 1 ≤ c ≤ y
for r in range(1, row + d1):
for c in range(1, col + 1):
if temp[r][c] == 5:
break
zone[FIRST] += board[r][c]
# 2๋ฒ ์ ๊ฑฐ๊ตฌ: 1 ≤ r ≤ x+d2, y < c ≤ N
for r in range(1, row + d2 + 1):
for c in range(N, col, -1):
if temp[r][c] == 5:
break
zone[SECOND] += board[r][c]
# 3๋ฒ ์ ๊ฑฐ๊ตฌ: x+d1 ≤ r ≤ N, 1 ≤ c < y-d1+d2
for r in range(row + d1, N + 1):
for c in range(1, col - d1 + d2):
if temp[r][c] == 5:
break
zone[THIRD] += board[r][c]
# 4๋ฒ ์ ๊ฑฐ๊ตฌ: x+d2 < r ≤ N, y-d1+d2 ≤ c ≤ N
for r in range(row + d2 + 1, N + 1):
for c in range(N, col - d1 + d2 - 1, -1):
if temp[r][c] == 5:
break
zone[FOURTH] += board[r][c]
fifth = total - sum(zone)
return max(max(zone), fifth) - min(min(zone), fifth)
if __name__ == '__main__':
N = int(input())
board = [[]]
for _ in range(N):
# ์ธ๋ฑ์ค์ ๋ง๊ฒ 1์ฉ ์ถ๊ฐ
board.append([0] + list(map(int, stdin.readline().split())))
total = sum(sum(board, []))
answer = maxsize
for r in range(1, N + 1):
for c in range(1, N + 1):
for d1 in range(1, N + 1):
for d2 in range(1, N + 1):
if r + d1 + d2 > N:
continue
if 1 > c - d1:
continue
if c + d2 > N:
continue
answer = min(answer, calculate(r, c, d1, d2))
print(answer)
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 17837 ์๋ก์ด ๊ฒ์ 2 (0) | 2021.04.18 |
---|---|
๋ฐฑ์ค: 19237 ์ด๋ฅธ ์์ด (0) | 2021.04.17 |
๋ฐฑ์ค: 19238 ์คํํธ ํ์ (0) | 2021.04.15 |
๋ฐฑ์ค: 20058 ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด์คํฐ (2) | 2021.04.14 |
๋ฐฑ์ค: 20055 ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์ ๋ก๋ด (0) | 2021.04.13 |