๐Ÿ—๏ธ Algorithm/๐ŸŸฉ ๋ฐฑ์ค€

๐ŸŸฉ [๋ฐฑ์ค€] [Python] 1987๋ฒˆ_์•ŒํŒŒ๋ฒณ

Dbswnstjd 2022. 11. 21. 04:45

๋ฌธ์ œ

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

 

1987๋ฒˆ: ์•ŒํŒŒ๋ฒณ

์„ธ๋กœ R์นธ, ๊ฐ€๋กœ C์นธ์œผ๋กœ ๋œ ํ‘œ ๋ชจ์–‘์˜ ๋ณด๋“œ๊ฐ€ ์žˆ๋‹ค. ๋ณด๋“œ์˜ ๊ฐ ์นธ์—๋Š” ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์ด ํ•˜๋‚˜์”ฉ ์ ํ˜€ ์žˆ๊ณ , ์ขŒ์ธก ์ƒ๋‹จ ์นธ (1ํ–‰ 1์—ด) ์—๋Š” ๋ง์ด ๋†“์—ฌ ์žˆ๋‹ค. ๋ง์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋„ค ์นธ ์ค‘์˜ ํ•œ ์นธ์œผ

www.acmicpc.net

ํ’€์ด

import sys
def bfs():
    global cnt
    queue = set([(0, 0, graph[0][0])]) # ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ค‘๋ณต๋˜๋Š” ๊ณณ์€ ์ œ๊ฑฐ

    while queue:
        x, y, z = queue.pop()

        # ๋ง์ด ์ง€๋‚  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์˜ ์นธ ์ดˆ๊ธฐํ™”
        cnt = max(cnt, len(z))

        # ์ƒ/ํ•˜/์ขŒ/์šฐ ํƒ์ƒ‰
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            # ๋ฒ”์œ„ ๋‚ด์— ์žˆ๊ณ  ์•ŒํŒŒ๋ฒณ์ด ์ค‘๋ณต์ด ์•ˆ๋œ๋‹ค๋ฉด ํƒ์ƒ‰
            if 0 <= nx < r and 0 <= ny < c and graph[nx][ny] not in z:
                queue.add((nx, ny, graph[nx][ny] + z))


r, c = map(int, sys.stdin.readline().split())

graph = [list(map(str, sys.stdin.readline().strip())) for _ in range(r)]

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
cnt = 1

bfs()
print(cnt)

BFS๋ฅผ ์ด์šฉํ•œ ํ’€์ด์ธ๋ฐ ์‹œ๊ฐ„์ด 1884ms ๋กœ DFS๋ฅผ ์‚ฌ์šฉํ•œ ํ’€์ด(7084ms)๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

# ๋ฐฑ์ค€ 1987๋ฒˆ ๋ฌธ์ œ - ์•ŒํŒŒ๋ฒณ
# dfs ํ’€์ด
import sys
def dfs(x, y, z):
    global cnt
    # ๋ง์ด ์ง€๋‚  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์˜ ์นธ ์ดˆ๊ธฐํ™”
    cnt = max(cnt, z)
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        # ๋ฒ”์œ„ ๋‚ด์— ์žˆ๊ณ  ํƒ์ƒ‰ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํƒ์ƒ‰
        if 0 <= nx < r and 0 <= ny < c and visited[graph[nx][ny]] == 0:
            visited[graph[nx][ny]] = 1
            dfs(nx, ny, z + 1) # ์žฌ๊ท€์ ์œผ๋กœ dfs ํƒ์ƒ‰
            visited[graph[nx][ny]] = 0 # ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ํƒˆ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ํ˜„์žฌ์˜ ์นธ์„ ํƒ์ƒ‰ ์•ˆํ•œ๊ฑธ๋กœ ์ดˆ๊ธฐํ™”

    return cnt

r, c = map(int, sys.stdin.readline().split())
# ๋žŒ๋‹ค ํ˜•์‹์œผ๋กœ ๋ฌธ์ž๋ฅผ ์•„์Šคํ‚ค ์ฝ”๋“œ๋กœ ๋ฐ”๊พผ๋‹ค.
graph = [list(map(lambda x: ord(x)-65, sys.stdin.readline().rstrip())) for _ in range(r)]
visited = [0] * 26 # 65 ~ 90 ๊นŒ์ง€

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
cnt = 1
visited[graph[0][0]] = 1
print(dfs(0, 0, cnt))

BFS๋กœ ํ’€๋‹ค๊ฐ€ ๋„์ €ํžˆ ๋‹ต์„ ์ฐพ๊ธฐ ๋ชปํ•˜์—ฌ DFS๋กœ ํ‘ผ ํ’€์ด๋ฅผ ๋ณด์•˜๋‹ค.

์‚ฌ์‹ค ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ฒƒ์„ ์–ด๋–ค์‹์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ• ์ง€ ๋ชฐ๋ผ์„œ ๋˜๊ฒŒ ํ—ค๋ฉ”์—ˆ์—ˆ๋‹ค. 

 

์ถœ์ฒ˜

https://fre2-dom.tistory.com/245