1. 문제
2. 정답 코드
# @Date : 2024-10-10 12:31:02 # @Author : ecodev # @Link : http://ecodev-blog.vercel.app import sys input = sys.stdin.readline ############ ---- Input Functions ---- ############ def inp(): return(int(input())) def inlt(): return(list(map(int, input().split()))) def insr(): s = input() return(list(s[:len(s) - 1])) def invr(): return(map(int, input().split())) r, c = invr() graph = [insr() for _ in range(r)] path = [(-1, 1), (0, 1), (1, 1)] def DFS(x, y): if y == c - 1: return True # 도달하자마자 바로 끝내기 for i in range(3): nx = x + path[i][0] ny = y + path[i][1] if 0 <= nx < r and 0 <= ny < c and not visited[nx][ny] and graph[nx][ny] == ".": visited[nx][ny] = True if DFS(nx, ny): return True return False visited = [[False] * c for _ in range(r)] ans = 0 for x in range(r): if DFS(x, 0): ans += 1 print(ans)
3. 생각한 방향 및 설명
문제 구현은 상당히 쉬웠는데 설명이 이해가 안가서 조금 애를 먹은 문제이다.
나는 질문 게시판에 있는 https://www.acmicpc.net/board/view/123309 이 게시글을 참고해서 정답이 어떤식으로 나오는지 알 수 있었다. 그 전까지는 계속 겹친다, 접한다 뭐 이런 자세하지 않은 설명으로 혼란스러웠다.
우선 구현과정은 굉장히 수월했다. 가스관을 설치하는 로직은 DFS로 간단히 작성할 수 있었다. 그렇지만 중간에 겹치면 안되는 부분때문에 이 부분을 어떻게 처리해야하지? 라는 생각을 오래했다.
그냥 단순하게 첫 행부터 순서대로 내려가고 있는 로직이기 때문에 각 행이 가장 끝 열의 최대한 위쪽으로 가게 만들어보자! 라는 생각을 하였다. 결국 가스관 설치자체를 최대한 위로 땡겨가면서 아래 새로 만들 가스관에 최대한 겹치지 않게 유도를 한 것이다. 따라서 설치순서를
위대각, 오른쪽, 아래대각
이런식으로 설치하면 DFS 재귀순서에 따라 최대한 안겹치게 설치 할 수 있게 될 것이기 때문에 이렇게 하면 최대값이 유도될 것 같다고 생각했다. 일단 정답은 맞았지만 이렇게 생각하는게 맞나? 라는 느낌은 많은 그리디문제에서 드는 것 같다.