[BOJ][๐ŸŸก3][๋ฐฑ์ค€#20057] ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํ† ๋„ค์ด๋„

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #20057


๋ฌธ์ œ

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๊ฐ€ ํ† ๋„ค์ด๋„๋ฅผ ๋ฐฐ์› ๊ณ , ์˜ค๋Š˜์€ ํ† ๋„ค์ด๋„๋ฅผ ํฌ๊ธฐ๊ฐ€ย Nร—N์ธ ๊ฒฉ์ž๋กœ ๋‚˜๋ˆ„์–ด์ง„ ๋ชจ๋ž˜๋ฐญ์—์„œ ์—ฐ์Šตํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์œ„์น˜ (r,ย c)๋Š” ๊ฒฉ์ž์˜ rํ–‰ c์—ด์„ ์˜๋ฏธํ•˜๊ณ , A[r][c]๋Š” (r, c)์— ์žˆ๋Š” ๋ชจ๋ž˜์˜ ์–‘์„ ์˜๋ฏธํ•œ๋‹ค. ํ† ๋„ค์ด๋„๋ฅผย ์‹œ์ „ํ•˜๋ฉด ๊ฒฉ์ž์˜ ๊ฐ€์šด๋ฐ ์นธ๋ถ€ํ„ฐ ํ† ๋„ค์ด๋„์˜ ์ด๋™์ด ์‹œ์ž‘๋œ๋‹ค.ย ํ† ๋„ค์ด๋„๋Š” ํ•œ ๋ฒˆ์— ํ•œ ์นธ ์ด๋™ํ•œ๋‹ค. ๋‹ค์Œ์€ N = 7์ธ ๊ฒฝ์šฐ ํ† ๋„ค์ด๋„์˜ ์ด๋™์ด๋‹ค.

ํ† ๋„ค์ด๋„๊ฐ€ ํ•œ ์นธ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋ž˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์ •ํ•œ ๋น„์œจ๋กœ ํฉ๋‚ ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

ํ† ๋„ค์ด๋„๊ฐ€ x์—์„œ y๋กœ ์ด๋™ํ•˜๋ฉด, y์˜ ๋ชจ๋“  ๋ชจ๋ž˜๊ฐ€ ๋น„์œจ๊ณผ ฮฑ๊ฐ€ ์ ํ˜€์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๋น„์œจ์ด ์ ํ˜€์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ชจ๋ž˜์˜ ์–‘์€ y์— ์žˆ๋Š” ๋ชจ๋ž˜์˜ย ํ•ด๋‹น ๋น„์œจ๋งŒํผ์ด๊ณ , ๊ณ„์‚ฐ์—์„œ ์†Œ์ˆ˜์  ์•„๋ž˜๋Š” ๋ฒ„๋ฆฐ๋‹ค. ฮฑ๋กœ ์ด๋™ํ•˜๋Š” ๋ชจ๋ž˜์˜ ์–‘์€ ๋น„์œจ์ด ์ ํ˜€์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์€ ๋‚จ์€ ๋ชจ๋ž˜์˜ ์–‘๊ณผ ๊ฐ™๋‹ค. ๋ชจ๋ž˜๊ฐ€ ์ด๋ฏธ ์žˆ๋Š” ์นธ์œผ๋กœ ๋ชจ๋ž˜๊ฐ€ ์ด๋™ํ•˜๋ฉด, ๋ชจ๋ž˜์˜ ์–‘์€ ๋”ํ•ด์ง„๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์€ ํ† ๋„ค์ด๋„๊ฐ€ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•  ๋•Œ์ด๊ณ , ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์œ„์˜ ๊ทธ๋ฆผ์„ ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜๋ฉด ๋œ๋‹ค. ํ† ๋„ค์ด๋„๋Š” (1, 1)๊นŒ์ง€ ์ด๋™ํ•œ ๋’ค ์†Œ๋ฉธํ•œ๋‹ค.ย ๋ชจ๋ž˜๊ฐ€ ๊ฒฉ์ž์˜ ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํ† ๋„ค์ด๋„๊ฐ€ ์†Œ๋ฉธ๋˜์—ˆ์„ย ๋•Œ, ๊ฒฉ์ž์˜ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ„ ๋ชจ๋ž˜์˜ ์–‘์„ ๊ตฌํ•ด๋ณด์ž.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ฒฉ์ž์˜ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฒฉ์ž์˜ ๊ฐ ์นธ์— ์žˆ๋Š” ๋ชจ๋ž˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. r๋ฒˆ์งธ ์ค„์—์„œ c๋ฒˆ์งธ ์ฃผ์–ด์ง€๋Š” ์ •์ˆ˜๋Š”ย A[r][c] ์ด๋‹ค.


์ถœ๋ ฅ

๊ฒฉ์ž์˜ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ„ ๋ชจ๋ž˜์˜ ์–‘์„ ์ถœ๋ ฅํ•œ๋‹ค.


์ œํ•œ

3 โ‰ค N โ‰ค 499 N์€ ํ™€์ˆ˜ 0 โ‰ค A[r][c] โ‰ค 1,000 ๊ฐ€์šด๋ฐ ์นธ์— ์žˆ๋Š” ๋ชจ๋ž˜์˜ ์–‘์€ 0


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

5
0 0 0 0 0
0 0 0 0 0
0 10 0 0 0
0 0 0 0 0
0 0 0 0 0


์ถœ๋ ฅ

10


์˜ˆ์ œ 2

์ž…๋ ฅ

5
0 0 0 0 0
0 0 0 0 0
0 100 0 0 0
0 0 0 0 0
0 0 0 0 0


์ถœ๋ ฅ

85


์˜ˆ์ œ 3

์ž…๋ ฅ

7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 2 3 0 5 6 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7


์ถœ๋ ฅ

139


์˜ˆ์ œ 4

์ž…๋ ฅ

5
100 200 300 400 200
300 243 432 334 555
999 111 0 999 333
888 777 222 333 900
100 200 300 400 500


์ถœ๋ ฅ

7501


์˜ˆ์ œ 5

์ž…๋ ฅ

5
0 0 100 0 0
0 0 100 0 0
0 0 0 0 0
0 0 100 0 0
0 0 100 0 0


์ถœ๋ ฅ

283


์˜ˆ์ œ 6

์ž…๋ ฅ

9
193 483 223 482 858 274 847 283 748
484 273 585 868 271 444 584 293 858
828 384 382 818 347 858 293 999 727
818 384 727 373 636 141 234 589 991
913 564 555 827 0 999 123 123 123
321 321 321 983 982 981 983 980 990
908 105 270 173 147 148 850 992 113
943 923 982 981 223 131 222 913 562
752 572 719 590 551 179 141 137 731


์ถœ๋ ฅ

22961


My Sol

import sys
input = sys.stdin.readline

def move_line():
    global ci, cj, direction, try_cnt
    for _ in range((try_cnt + 2) // 2):
        di, dj = direction[try_cnt % 4]
        move_one(di, dj)
        ci += di
        cj += dj
    try_cnt += 1

def move_one(di, dj):
    global ci, cj, try_cnt, direction, mat
    if ci == cj == 0: return
    stdi, stdj = ci+di, cj+dj
    stdv = mat[stdi][stdj]
    mat[stdi][stdj] = 0
    p1 = int(stdv*0.01)
    p2 = int(stdv*0.02)
    p5 = int(stdv*0.05)
    p7 = int(stdv*0.07)
    p10 = int(stdv*0.10)
    last = stdv - 2*(p1+p2+p7+p10) - p5

    # ์œ„์•„๋ž˜ ์ด๋™
    if try_cnt%2:
        check(stdi, stdj+1, p7)
        check(stdi, stdj-1, p7)
        check(stdi, stdj+2, p2)
        check(stdi, stdj-2, p2)
        check(stdi+di, stdj+1, p10)
        check(stdi+di, stdj-1, p10)
        check(stdi-di, stdj+1, p1)
        check(stdi-di, stdj-1, p1)
        check(stdi+di*2, stdj, p5)
        check(stdi + di, stdj, last)

    # ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ์ด๋™
    else:
        check(stdi+1, stdj, p7)
        check(stdi-1, stdj, p7)
        check(stdi+2, stdj, p2)
        check(stdi-2, stdj, p2)
        check(stdi+1, stdj+dj, p10)
        check(stdi-1, stdj+dj, p10)
        check(stdi+1, stdj-dj, p1)
        check(stdi-1, stdj-dj, p1)
        check(stdi, stdj+dj*2, p5)
        check(stdi, stdj + dj, last)

def check(i, j, v):
    global global_ans, mat, N
    if 0<=i<N and 0<=j<N:
        mat[i][j] += v
    else:
        global_ans += v

N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]

direction = {
    0: (0, -1),
    1: (1, 0),
    2: (0, 1),
    3: (-1, 0)
}
try_cnt = 0
ci = cj = N//2
global_ans = 0

move_line()
while not (ci==0 and cj==-1):
    for _ in range(4):
        move_line()

print(global_ans)

๊ฝค๋‚˜ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ๋„ ํ•˜๊ณ , ๋ฌธ์ œ์˜ ํ•ด์„์ด ์–ด๋ ต๊ธฐ๋„ ํ–ˆ๋˜ ๋ฌธ์ œ์˜€๋‹ค. ๋ชจ๋ž˜๋“ค์ด ๋‚ ์•„๊ฐ€๋ฉด, ๋‚ ์•„๊ฐ„ ๋ชจ๋ž˜์˜ ๋‚˜๋จธ์ง€๊ฐ€ ์•ŒํŒŒ๋ผ๋Š” ๊ฒƒ์ธ๋ฐ, ์ œ๋Œ€๋กœ ์•Œ๊ณ  ๋‚œ ๋’ค์—๋‚˜ ๋ฌธ์ œ๊ฐ€ ์ œ์‹œํ•œ ๋ง์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ฒŒ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

  1. 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  2. ์ค‘์•™๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์ค€์  ci, cj๋Š” N//2๋กœ ๋‘”๋‹ค. NxN 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ค‘์•™ ์ธ๋ฑ์Šค์ด๋‹ค.
  3. move_line ํ•จ์ˆ˜๋Š” ๋ฐฉํ–ฅ๊ณผ ์ƒ๊ด€ ์—†์ด ์‹คํ–‰ํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ„์† ์ง„ํ–‰ํ•œ๋‹ค.
  4. try_cnt ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์˜ฌ๋ ค๊ฐ€๋ฉด์„œ move_line ํ•จ์ˆ˜์˜ ๊ธธ์ด์™€ ๋ฐฉํ–ฅ์„ ๊ฒฐ์ •ํ•œ๋‹ค.
  5. ๋ชจ๋“  ํšŒ์ „์ด ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋์ด ๋‚˜๊ณ , ์‹œ์ž‘๋„ ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋ฏ€๋กœ, ์ฒ˜์Œ move_line์„ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•œ ๋’ค, 4๋ฒˆ์„ ํ˜ธ์ถœํ•˜๋ฉฐ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋์— ๋„๋‹ฌํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  6. move_line ํ•จ์ˆ˜๋Š” ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉฐ ๋ชจ๋ž˜๋ฅผ ์˜ฎ๊ฒจ๊ฐ€๋Š” move_one ํ•จ์ˆ˜์˜ ๊ธธ์ด์™€ ๋ฐฉํ–ฅ์„ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋ผ์ธ์„ ๋ชจ๋‘ ์ด๋™ํ•˜๋ฉด try_cnt๋ฅผ ๋Š˜๋ฆฌ๋ฉฐ ๋‹ค์Œ ํšŒ์ „์„ ์œ„ํ•œ ๋Œ€๋น„๋ฅผ ํ•œ๋‹ค.
  7. move_one ํ•จ์ˆ˜๋Š” ์ด๋™ํ•˜๋Š” ์œ„์น˜์˜ ๋ชจ๋ž˜์™€ ๋น„์œจ์„ ๊ณ„์‚ฐํ•ด ์ฃผ๋ณ€์˜ ์ขŒํ‘œ๋กœ ๋‚ ๋ ค๋ฒ„๋ฆฐ๋‹ค. ๊ฒฉ์ž ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ„ ๋ชจ๋ž˜์˜ ์–‘์€ global_ans ๋ณ€์ˆ˜์— ๋”ฐ๋กœ ๋ˆ„์ ํ•ด๋‘”๋‹ค.
  8. ๋ชจ๋“  ํšŒ์ „์ด ๋๋‚˜๋ฉด global_ans๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ