๐Ÿ”‘ CS/์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[๋ฐฑ์ค€ 14500๋ฒˆ] ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ (python/ํŒŒ์ด์ฌ)

๋ณต๋งŒ 2022. 9. 14. 14:38

๋ถ„๋…ธ์˜ ํ…ŒํŠธ๋ฆฌ์Šค..

๋จธ๋ฆฌ๊ฐ€ ๋‚˜์˜๋ฉด ๋ชธ์ด ๊ณ ์ƒํ•œ๋‹ค

 

๐ŸŒผ ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/14500

 

14500๋ฒˆ: ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ž€ ํฌ๊ธฐ๊ฐ€ 1×1์ธ ์ •์‚ฌ๊ฐํ˜•์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ด์–ด์„œ ๋ถ™์ธ ๋„ํ˜•์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์€ ์„œ๋กœ ๊ฒน์น˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋„ํ˜•์€ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€

www.acmicpc.net

  • ํ‹ฐ์–ด: ๊ณจ๋“œ IV
  • ๋ถ„๋ฅ˜: ๊ตฌํ˜„, ๋ธŒ๋ฃจํŠธํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

 

โ— TRIAL 1.

๋”๋ณด๊ธฐ
์ฝ”๋“œ
import sys
input = sys.stdin.readline

from collections import deque

N, M = list(map(int, input().split()))
paper = []
totalmax = 0
for _ in range(N):
    line = list(map(int, input().split()))
    paper.append(line)
    totalmax = max(totalmax, max(line))

def solution(init_i, init_j, N, M):
    maxval = 0
    
    dis = [1, -1, 0, 0]
    djs = [0, 0, 1, -1]
    
    queue = deque([([(init_i, init_j)], paper[init_i][init_j])])
    while queue:
        path, ctr = queue.popleft()
        i, j = path[-1]
        for di, dj in zip(dis, djs):
            new_i, new_j = i+di, j+dj
            if 0<=new_i<N and 0<=new_j<M and (new_i, new_j) not in path:
                new_path, new_val = path+[(new_i, new_j)], val+paper[new_i][new_j]
                if len(path) == 3:
                    maxval = max(maxval, new_val)
                else:
                    queue.append((new_path, new_val))

    T_shapes = [
        [(0, -1), (0, 1), (1, 0)], #ใ…
        [(0, -1), (0, 1), (-1, 0)], #ใ…“
        [(-1, 0), (1, 0), (0, 1)], #ใ…œ
        [(-1, 0), (1, 0), (0, -1)], #ใ…—
    ]

    for center_di, center_dj in zip(dis+[0], djs+[0]):
        center_i, center_j = init_i+center_di, init_j+center_dj
        if 0<=center_i<N and 0<=center_j<M:
            center_val = paper[center_i][center_j]
            for T_d in T_ds:
                T_sum = center_val
                for di, dj in T_d:
                    adj_i, adj_j = center_i+di, center_j+dj
                    if not (0<=adj_i<N and 0<=adj_j<M):
                        break
                    T_sum += paper[adj_i][adj_j]
                maxval = max(maxval, T_sum)
    
    return maxval
                    
maxval = totalmax+3
for i in range(N):
    for j in range(M):
        if paper[i][j]*4 > maxval:
            maxval = max(maxval, solution(i, j, N, M))

print(maxval)

 

์ฝ”๋“œ ์„ค๋ช…

 

- ์šฐ์„  ๋ชจ๋“  ํฌ์ธํŠธ์— ๋Œ€ํ•ด ๊ฒ€์‚ฌํ•˜์ง€๋Š” ์•Š๊ณ , ํ˜„์žฌ ํฌ์ธํŠธ ๊ฐ’ * 4 > ํ˜„์žฌ ์ตœ๋Œ“๊ฐ’ ์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. ์ด ๊ฒ€์‚ฌ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•จ.

- ์ดˆ๊ธฐ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’๋“ค์— ๋Œ€ํ•ด ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๊ณ , ๊ฑฐ๊ธฐ์— 3์„ ๋”ํ•œ ๊ฐ’์„ ์ดˆ๊ธฐ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค. (๋ชจ๋“  ๊ฐ’์ด ์ž์—ฐ์ˆ˜๋ผ๋Š” ์กฐ๊ฑด์ด ์žˆ์œผ๋ฏ€๋กœ)

- T์ž๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” BFS๋กœ ๊ตฌํ•˜๊ณ , T์ž๋Š” ๋”ฐ๋กœ ๋นผ์„œ ๊ตฌํ•จ

 

ํ‹€๋ฆฐ ์›์ธ

 

ํ‹€๋ฆผ. T์ž์—์„œ  ๊ฐ€์šด๋ฐ๊ฐ€ ์ตœ๋Œ“๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋ฅผ ์ง€๋‚˜์นจ

๋ฐ˜๋ก€:

4 4 
1 1 1 1
1 2 1 1
1 2 9 1
1 2 1 1

 

 

โ— TRIAL 2.

๋”๋ณด๊ธฐ
์ฝ”๋“œ
import sys
input = sys.stdin.readline

from collections import deque

N, M = list(map(int, input().split()))
paper = []
totalmax = 0
for _ in range(N):
    line = list(map(int, input().split()))
    paper.append(line)
    totalmax = max(totalmax, max(line))

def solution_BFS(init_i, init_j, N, M):
    maxval = 0
    
    dis = [1, -1, 0, 0]
    djs = [0, 0, 1, -1]
    
    queue = deque([( [(init_i, init_j)], paper[init_i][init_j] )]) #path, val
    
    while queue:
        path, val = queue.popleft()
        i, j = path[-1]
        for di, dj in zip(dis, djs):
            new_i, new_j = i+di, j+dj
            if 0<=new_i<N and 0<=new_j<M and (new_i, new_j) not in path:
                new_path, new_val = path+[(new_i, new_j)], val+paper[new_i][new_j]
                if len(new_path) == 4:
                    maxval = max(maxval, new_val)
                else:
                    queue.append((new_path, new_val))

    return maxval

def solution_T(init_i, init_j, N, M):
    maxval = 0

    T_shapes = [
        [(0, -1), (0, 1), (1, 0)], #ใ…
        [(0, -1), (0, 1), (-1, 0)], #ใ…“
        [(-1, 0), (1, 0), (0, 1)], #ใ…œ
        [(-1, 0), (1, 0), (0, -1)], #ใ…—
    ]

    dis = [1, -1, 0, 0]
    djs = [0, 0, 1, -1]
    
    for center_di, center_dj in zip(dis+[0], djs+[0]):
        center_i, center_j = init_i+center_di, init_j+center_dj
        if 0<=center_i<N and 0<=center_j<M:
            center_val = paper[center_i][center_j]
            for T_adj in T_shapes:
                T_val = center_val
                for di, dj in T_adj:
                    adj_i, adj_j = center_i+di, center_j+dj
                    if not (0<=adj_i<N and 0<=adj_j<M):
                        break
                    T_val += paper[adj_i][adj_j]
                maxval = max(maxval, T_val)
                
    return maxval
                    
maxval = totalmax+3
for i in range(N):
    for j in range(M):
        if paper[i][j]*4 > maxval:
            maxval = max(maxval, solution_BFS(i, j, N, M), solution_T(i, j, N, M))
print(maxval)

 

์ˆ˜์ •ํ•œ ๋ถ€๋ถ„

 

- ์ผ๋‹จ BFS ๋ถ€๋ถ„๊ณผ T ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌ.

- T ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ–ˆ์Œ.

- init_i, init_j๋ฅผ ํฌํ•จํ•˜๋Š” T์žํ˜•ํƒœ๋งŒ ๊ฒ€์‚ฌํ• ๊นŒ ํ•˜๋‹ค๊ฐ€ ๋„์ €ํžˆ ์ฝ”๋“œ๋ฅผ ๋ชป์งœ๊ฒ ์–ด์„œ ๊ทธ๋ƒฅ init_i, init_j ํฌํ•จ ์ƒํ•˜์ขŒ์šฐ ์ขŒํ‘œ์— ๋Œ€ํ•ด T์ž๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€

 

ํ‹€๋ฆฐ ์›์ธ

 

ํ‹€๋ฆผ. BFS๋กœ ํƒ์ƒ‰ํ•˜๋Š” T์ž๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ์–‘์—์„œ๋„ ๋งจ ๋์ด ์•„๋‹Œ ๋ถ€๋ถ„์— ์ตœ๋Œ“๊ฐ’์ด ์œ„์น˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค..

๋ฐ˜๋ก€:

4 4
1 2 1 1
1 9 1 1
1 2 1 1
1 2 1 1

๊ฒ€์‚ฌํ•˜๋Š” ํฌ์ธํŠธ์˜ ์ƒํ•˜์ขŒ์šฐ์— ๋Œ€ํ•ด ๋™์ผํ•œ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋‚˜ ํ–ˆ๋Š”๋ฐ

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ค‘๋ณต์œผ๋กœ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง

 

๐Ÿ’ก Solution

์ฝ”๋“œ
import sys
input = sys.stdin.readline

from collections import deque

N, M = list(map(int, input().split()))
paper = []
totalmax = 0
for _ in range(N):
    line = list(map(int, input().split()))
    paper.append(line)
    totalmax = max(totalmax, max(line))

def solution_BFS(init_i, init_j, N, M):
    maxval = 0
    
    dis = [1, -1, 0, 0]
    djs = [0, 0, 1, -1]
    
    queue = deque([( [(init_i, init_j)], paper[init_i][init_j] )]) #path, val
    
    while queue:
        path, val = queue.popleft()
        for i, j in path:
            for di, dj in zip(dis, djs):
                new_i, new_j = i+di, j+dj
                if 0<=new_i<N and 0<=new_j<M and (new_i, new_j) not in path:
                    new_path, new_val = path+[(new_i, new_j)], val+paper[new_i][new_j]
                    if len(new_path) == 4:
                        maxval = max(maxval, new_val)
                    else:
                        queue.append((new_path, new_val))

    return maxval
       
maxval = totalmax+3
for i in range(N):
    for j in range(M):
        if paper[i][j]*4 > maxval:
            maxval = max(maxval, solution_BFS(i, j, N, M))
print(maxval)

 

์ฝ”๋“œ ์„ค๋ช…
  • ๋ชจ๋“  ํฌ์ธํŠธ์— ๋Œ€ํ•ด ๊ฒ€์‚ฌํ•˜์ง€๋Š” ์•Š๊ณ , ํ˜„์žฌ ํฌ์ธํŠธ ๊ฐ’ * 4 > ํ˜„์žฌ ์ตœ๋Œ“๊ฐ’ ์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ (์ด ๊ฒ€์‚ฌ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•จ)
  • ์ดˆ๊ธฐ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’๋“ค์— ๋Œ€ํ•ด ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๊ณ , ๊ฑฐ๊ธฐ์— 3์„ ๋”ํ•œ ๊ฐ’์„ ์ดˆ๊ธฐ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค. (๋ชจ๋“  ๊ฐ’์ด ์ž์—ฐ์ˆ˜๋ผ๋Š” ์กฐ๊ฑด์ด ์žˆ์œผ๋ฏ€๋กœ)
  • BFS๋ฅผ ์ด์šฉํ•ด ๋ชจ๋“  ๋ชจํ˜•์„ ๊ตฌํ•จ.
    • ํ˜„์žฌ์œ„์น˜์—์„œ ์‹œ์ž‘ํ•ด์„œ, ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ํ•œ ์ขŒํ‘œ๋กœ ์ด๋™ํ›„ path๋ฅผ ๋ˆ„์ ํ•ด์„œ queue์— ์ €์žฅํ•œ๋‹ค. ์ด ๋•Œ path์— ์†ํ•˜๋Š” ๊ฐ’๋“ค์˜ ํ•ฉ๋„ ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค (val)
    • queue์—์„œ pop์„ ํ•ด์„œ path๋ฅผ ์–ป์€ ํ›„, path์— ์†ํ•˜๋Š” ๋ชจ๋“  ํฌ์ธํŠธ์— ๋Œ€ํ•ด ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ํ•œ ์ขŒํ‘œ๋กœ ์ด๋™์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ด ๋•Œ, ์ด๋™ํ•  ์ขŒํ‘œ๊ฐ€ ์ด๋ฏธ path์— ์žˆ์œผ๋ฉด ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • path์˜ ๊ธธ์ด๊ฐ€ 4๊ฐ€ ๋˜๋ฉด ๋”์ด์ƒ queue์— appendํ•˜์ง€ ์•Š๊ณ , maxval๊ณผ ๋น„๊ตํ•ด์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
    • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด T์ž๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋จ.

 

๊ฒฐ๊ณผ
  • Solution์˜ ์ฝ”๋“œ - 384ms
  • Solution์˜ ์ฝ”๋“œ๋กœ ๋ชจ๋“  point ๊ฒ€์‚ฌ ์‹œ - ์‹œ๊ฐ„์ดˆ๊ณผ
  • Trial3์˜ ์ฝ”๋“œ๋กœ ๋ชจ๋“  point ๊ฒ€์‚ฌ ์‹œ - 2720ms

 

๋‹ค๋ฅธ ํ’€์ด
  • ํ’€์ด1: DFS ์ด์šฉ (188ms)
    • ๋ชจ๋“  ํฌ์ธํŠธ์— ๋Œ€ํ•ด ๊ฒ€์‚ฌ. ๋‹จ, ๋งค depth๋งˆ๋‹ค, ๋‚จ์€ depth*์ตœ๋Œ€๊ฐ’์„ ๋”ํ•ด๋„ ํ˜„์žฌ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ํƒ์ƒ‰์„ ์ค‘์ง€ํ•จ์œผ๋กœ์จ ํƒ์ƒ‰ ํšŸ์ˆ˜๋ฅผ ์ค„์ž„ (์ด ๋ฐฉ์‹์œผ๋กœ ํฌ์ธํŠธ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋Š”๊ฒŒ ์‹œ๊ฐ„์„ ๋” ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋“ฏ ํ•˜๋‹ค.)
    • ํ•œ ํฌ์ธํŠธ -> ์ธ์ ‘ ํฌ์ธํŠธ -> ์ธ์ ‘ ํฌ์ธํŠธ ์ด๋ ‡๊ฒŒ depth๊ฐ€ 4๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰
    • T๋ชจ์–‘์— ๋Œ€ํ•ด ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด, depth๊ฐ€ 2์ธ ๊ฒฝ์šฐ์—๋Š” ์ด์ „ ์œ„์น˜์—์„œ ์ด์–ด์„œ ์ง„ํ–‰ํ•˜๋„๋ก ํ•จ
      • ์˜ˆ) (x, y) -> (x, y+1) -> (x, y+2) -> (x+1, y+1)
๋ฐ˜์‘ํ˜•