8/1 Coding Test

κΉ€νƒœμ€€Β·2023λ…„ 8μ›” 1일
0

Coding Test - BOJ

λͺ©λ‘ 보기
39/64
post-thumbnail

βœ… BOJ

🎈 17779 κ²Œλ¦¬λ§¨λ”λ§ 2

주어진 μ‹œμ˜ 이름은 μž¬ν˜„μ‹œλ‘œ NXN의 격자둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. rν–‰ cμ—΄μ˜ ꡬ역은 (r,c)둜 λ‚˜νƒ€λ‚Ό 수 있고 주어진 μ‹œλ₯Ό 5개의 μ„ κ±°κ΅¬λ‘œ λ‚˜λˆŒ 수 μžˆμ–΄μ•Ό ν•˜λ©° 각 ꡬ역은 λ‹€μ„― 선거ꡬ 쀑 ν•˜λ‚˜μ— ν¬ν•¨λ˜μ–΄μ•Ό ν•œλ‹€.

선거ꡬλ₯Ό λ‚˜λˆ„λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.
1. 기쀀점 (X, Y)와 κ²½κ³„μ˜ 길이 (d1, d2)λ₯Ό μ •ν•œλ‹€. (d1, d2 >=1, 1<=x<x+d1+d2<=N, 1<=y-d1<y<y+d2<=N)
2. 경계선이 주어진닀. (κ²½κ³„μ„ μ˜ λ²”μœ„λŠ” +- d1, d2둜 총 4개)
3. 경계선과 경계선 λ‚΄ ν¬ν•¨λœ 곳은 5번 선거ꡬ

  • μž…λ ₯κ°’ : μ²«μ€„μ—λŠ” 크기 n, λ‘˜μ§Έ 쀄뢀터 nμ€„κΉŒμ§€ n개의 μ •μˆ˜κ°€ 주어짐.
  • 좜λ ₯κ°’ : 첫쀄에 인ꡬ가 κ°€μž₯λ§Žμ€ 선거ꡬ와 κ°€μž₯ 적은 μ„ κ±°κ΅¬μ˜ 인ꡬ 차이 μ΅œμ†Ÿκ°’ 좜λ ₯
import sys
input = sys.stdin.readline

n = int(input())
graph = [[0]*(n+1)] + [[0] + list(map(int,input().split())) for _ in range(n)]

total_sum = 0
for i in range(1, n+1):
    total_sum += sum(graph[i])

def boundary(x, y, d1, d2):
    tmp = [[0]*(n+1) for _ in range(n+1)]
    tmp[x][y] = 5
    for i in range(1, d1+1):
        tmp[x+i][y-i] = 5
    for i in range(1, d1+1):
        tmp[x+d2+i][y+d2-i] = 5
    for i in range(1, d2+1):
        tmp[x+i][y+i] = 5
    for i in range(1, d2+1):
        tmp[x+d1+i][y-d1+i] = 5
    # 선거ꡬ 5개
    people = [0] * 5

    # 1번 선거ꡬ
    for i in range(1, x+d1):
        for j in range(1, y+1):
            if tmp[i][j] == 5:
                break
            else:
                people[0] += graph[i][j]
    # 2번
    for i in range(1, x+d2+1):
        for j in range(n, y, -1):
            if tmp[i][j] == 5:
                break
            else:
                people[1] += graph[i][j]
    # 3번
    for i in range(x+d1, n+1):
        for j in range(1, y-d1+d2):
            if tmp[i][j] == 5:
                break
            else:
                people[2] += graph[i][j]
    # 4번
    for i in range(x+d2+1, n+1):
        for j in range(n, y-d1+d2-1, -1):
            if tmp[i][j] == 5:
                break
            else:
                people[3] += graph[i][j]
    # 5번
    people[4] += total_sum - sum(people)
    return max(people) - min(people)

answer = 1e9
for x in range(1, n+1):
    for y in range(1, n+1):
        for d1 in range(1,n+1):
            for d2 in range(1, n+1):
                if x+d1+d2 > n:
                    continue
                if y-d1 < 1:
                    continue
                if y+d2 > n:
                    continue
                answer = min(answer, boundary(x,y,d1,d2))
print(answer)
profile
To be a DataScientist

0개의 λŒ“κΈ€