ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

16929번: Two Dots

첫째 쀄에 κ²Œμž„νŒμ˜ 크기 N, M이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 κ²Œμž„νŒμ˜ μƒνƒœκ°€ 주어진닀. κ²Œμž„νŒμ€ λͺ¨λ‘ 점으둜 가득차 있고, κ²Œμž„νŒμ˜ μƒνƒœλŠ” 점의 색을 μ˜λ―Έν•œλ‹€. 점의 색은 μ•ŒνŒŒλ²³ λŒ€λ¬ΈοΏ½οΏ½

www.acmicpc.net

 

문제 풀이

  νŠΉμ • 지점을 μ‹œμž‘μœΌλ‘œ 같은 색을 가진 싸이클이 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€. λ”°λΌμ„œ νŠΉμ • μ§€μ μ—μ„œ DFSλ₯Ό 톡해 상, ν•˜, 쒌, 우둜 μˆœνšŒν•˜λ˜ 같은 좜발 지점과 같은 색인지와, λ°©λ¬Έμ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜κ²Œ 되면 싸이클 μ—¬λΆ€λ₯Ό 확인 ν•  수 μžˆλ‹€.

 

 DFSλ₯Ό 톡해 탐색할 λ•Œ λ‹€μŒκ³Ό 같이 μ§„ν–‰ν•˜λ©΄ 닡을 찾을 수 μžˆλ‹€.

  • 상, ν•˜, 쒌, 우 탐색 μ‹œ 0 <= x < n, 0 <= y < mκ³Ό 같이 μ˜μ—­μ„ λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ”μ§€ ν™•μΈν•˜μ—¬μ•Ό ν•œλ‹€.
  • μ΅œμ†Œ 싸이클을 μ΄λ£¨λŠ” 점의 κ°œμˆ˜λŠ” 4개 이닀.
    • 점의 κ°œμˆ˜κ°€ 4개 이상이고, μ‹œμž‘μ μœΌλ‘œ λŒμ•„μ˜¨λ‹€λ©΄ 싸이클이 μžˆλŠ” 것이닀.
  • λ°±νŠΈλž™ν‚Ήμ΄ ν•„μš”ν•˜λ―€λ‘œ, μž¬κ·€ 호좜 ν›„ μ›λž˜ 되둜 μ΄ˆκΈ°ν™”ν•˜μ—¬μ•Ό ν•œλ‹€.

 

μ½”λ“œ

from sys import stdin


def visitable(x, y):
    return 0 <= x < n and 0 <= y < m and not visited[x][y]


def dfs(cnt, start, cur, color):
    for x, y in dirs:
        next_x, next_y = cur[X] + x, cur[Y] + y

        # 4점 이상을 λ°©λ¬Έν•˜κ³ , 좜발점과 κ°™λ‹€λ©΄ 싸이클이 μžˆλŠ” 것이닀.
        if cnt >= 4 and start == [next_x, next_y]:
            print('Yes')
            exit()

        if visitable(next_x, next_y) and graph[next_x][next_y] == color:
            visited[next_x][next_y] = True
            dfs(cnt + 1, start, [next_x, next_y], color)
            visited[next_x][next_y] = False


if __name__ == "__main__":
    answer = False
    X, Y = 0, 1
    n, m = map(int, stdin.readline().split())
    graph = [list(stdin.readline().strip()) for _ in range(n)]
    visited = [[False] * m for _ in range(n)]
    dirs = ((0, 1), (0, -1), (1, 0), (-1, 0))

    for x in range(n):
        for y in range(m):
            if not visited[x][y]:
                visited[x][y] = True
                dfs(1, [x, y], [x, y], graph[x][y])

    print('No')
728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€