[Baekjoon/๐ŸฅˆGoldโ…ฃ] 14500: ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

3 ๋ถ„ ์†Œ์š”

๐Ÿ™‹โ€โ™€๏ธ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์œ„ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ !!

๐Ÿ™‹โ€โ™€๏ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ข…์ด์˜ ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (4 โ‰ค N, M โ‰ค 500)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ข…์ด์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. i๋ฒˆ์งธ ์ค„์˜ j๋ฒˆ์งธ ์ˆ˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ i๋ฒˆ์งธ ์นธ, ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ j๋ฒˆ์งธ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜์ด๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ์ˆ˜๋Š” 1,000์„ ๋„˜์ง€ ์•Š๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค.

๐Ÿ™‹โ€โ™€๏ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๊ฐ€ ๋†“์ธ ์นธ์— ์“ฐ์ธ ์ˆ˜๋“ค์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


๐Ÿ‘ฉโ€๐Ÿ’ป Algoritm: Brute Force

ํ•„์ž์˜ ๊ฒฝ์šฐ, ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ง์ ‘ ๋ฐฐ์—ด์— ๋„ฃ์–ด ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ธŒ๋ฃจํŠธ ํฌ์Šค๋ฅผ ์ ์šฉํ•˜์˜€๋‹ค.

import sys

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

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

dx = [(0, 1, 2, 3), (0, 0, 0, 0), (0, 0, 0, 1), (0, 1, 2, 2), (0, 1, 1, 1)
  , (0, 1, 1, 1), (0, 0, 1, 2), (0, -1, -1, -1), (0, -1, -1, -2), (0, 0, 1, 1), (0, 0, -1, -1)
    , (0, 1, 1, 2), (0, 1, 1, 2), (0, -1, 0, 1), (0, 0, 0, 1), (0, 0, 0, -1), (0, 0, 1, 1), (0, 0, 1, 2), (0, 0, -1, -2)]
dy = [(0, 0, 0, 0), (0, 1, 2, 3), (0, 1, 2, 2), (0, 0, 0, -1), (0, 0, 1, 2)
  , (0, 0, -1, -2), (0, 1, 1, 1), (0, 0, 1, 2), (0, 0, 1, 1), (0, 1, 1, 2), (0, 1, 1, 2)
  , (0, 0, 1, 1), (0, 0, 1, 0), (0, 1, 1, 1), (0, 1, 2, 1), (0, 1, 2, 1), (0, 1, 1, 0), (0, -1, -1, -1), (0, -1, -1, -1)]

for i in range(n):
  for j in range(m):
    for k in range(19):
      s = 0
      for l in range(4):
        ny = i+dy[k][l]
        nx = j+dx[k][l]

        if 0<=ny<n and 0<=nx<m:
          s += graph[ny][nx]
        else:
          break
      answer = max(answer, s)

print(answer)

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ผ์ผ์ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ง์ ‘ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ง๊ณ ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ ์ƒ๊ฐํ•˜๋‹ค ๋‹ค๋ฅธ ๋ถ„์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  dfs๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ง€๊ธˆ๋ถ€ํ„ฐ dfs๋ฅผ ํ†ตํ•ด ํ’€์ด๋ฅผ ์ง„ํ–‰ํ•ด๋ณด์ž!!


๐Ÿ‘ฉโ€๐Ÿ’ป Algorithm: dfs

์•„๋ž˜ ๊ทธ๋ฆผ์˜ ๋„ํ˜•๋“ค์˜ ํšŒ์ „, ๋Œ€์นญ ์‹œ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ชจ๋“  ๋„ํ˜•๋“ค์€ ๊นŠ์ด 3์ธ dfs๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

  1. ์šฐ์„  ์œ„ ๋„ํ˜•๋“ค์€ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ•˜๋‚˜์˜ ์„ ์œผ๋กœ ์ด์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ dfs๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ์˜ ๊ฒฝ์šฐ, 4๊ฐœ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊นŠ์ด 3๋งŒํผ์„ ์ด๋™ํ•ด ์ด 4๊ฐœ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ชจ๋“  ๋„ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‚˜๋จธ์ง€ ํ•œ ๋„ํ˜•์˜ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ?

๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ•ด๋‹น ๋„ํ˜•์€ ์‹œ์ž‘์ ์œผ๋กœ๋ถ€ํ„ฐ ์ƒํ•˜์ขŒ์šฐ ์ค‘ ์„ธ๊ฐ€์ง€ ์š”์†Œ๋งŒ์„ ๊ณ ๋ คํ•˜๋ฉด ๋œ๋‹ค. ์ด๋Š” ์œ„ dfs ๊ณผ์ •๊ณผ๋Š” ๋ณ„๋„๋กœ ์ถ”๊ฐ€์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์กฐ๊ธˆ ๋” ์ •ํ™•ํžˆ ๊ทธ ๊ณผ์ •์„ ์ดํ•ดํ•ด๋ณด์ž!!


import sys

n, m = map(int, sys.stdin.readline().split())
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
visited = [[0]*m for _ in range(n)]

# ์ตœ๋Œ€๊ฐ’
maxValue = 0
 
# ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ขŒํ‘œ
dy = [0, 0, -1, 1]
dx = [-1, 1, 0, 0]

def dfs(y, x, s, t):
  global maxValue

  if t == 4: # ์‹œ์ž‘์ (1)์—์„œ ๊นŠ์ด๊ฐ€ 3์ผ ๊ฒฝ์šฐ
    maxValue = max(maxValue, s)
    return

  for i in range(4):
    ny = y + dy[i]
    nx = x + dx[i]

    if 0<=ny<n and 0<=nx<m and visited[ny][nx] == 0:
      visited[ny][nx] = 1
      dfs(ny, nx, s+graph[ny][nx], t+1)
      visited[ny][nx] = 0

# ใ…—, ใ…, ใ…œ, ใ…“์˜ ๊ฒฝ์šฐ
def shapeHats(y, x):
  global maxValue

  for i in range(4):
    tmp = graph[y][x] # ์‹œ์ž‘์ง€์ ์œผ๋กœ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
    for j in range(3): # ์ƒํ•˜์ขŒ์šฐ ์ค‘ ์„ธ์š”์†Œ๋งŒ ๊ณ ๋ ค
      ny = y + dy[(i+j)%4]
      nx = x + dx[(i+j)%4]

      if not (0<=ny<n and 0<=nx<m):
        tmp = 0
        break
      tmp += graph[ny][nx]
    maxValue = max(maxValue, tmp)

# ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ํŒŒ์•…
for i in range(n):
  for j in range(m):
    visited[i][j] = 1
    dfs(i, j, graph[i][j], 1)
    visited[i][j] = 0

    shapeHats(i, j) # dfs์™€ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ ์ง„ํ–‰

print(maxValue)


๐Ÿ™‹โ€โ™€๏ธ TIL

์ฒ˜์Œ ๋ชจ์–‘์ด ์ œ๊ฐ๊ฐ์ธ ๋„ํ˜•์˜ ์ตœ๋Œ“๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ•ด์•ผํ• ์ง€ ๊ฐ์ด ์ž˜ ์˜ค์ง€ ์•Š์•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌธ์ œ์—์„œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋„ํ˜•์˜ ๋ชจ์–‘๋“ค์ด ์•„๋‹ˆ๋ผ ๋„ํ˜•์˜ ํŠน์ง•์ด์—ˆ๋‹ค. ํ•˜๋‚˜์˜ ์„ ์œผ๋กœ ์ด์–ด์ง€๊ธฐ์— **dfs๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋„ํ˜•์˜ ๊ตฌ์„ฑ ์ •์‚ฌ๊ฐํ˜•์˜ ์ˆ˜์— ๋”ฐ๋ผ์„œ ๊ทธ ๊นŠ์ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

dfs์˜ ์ƒˆ๋กœ์šด ์ ‘๊ทผ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ“ ์ฐธ๊ณ  ์ž๋ฃŒ

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