포도가게의 개발일지

python 백준 1987 알파벳 본문

백준

python 백준 1987 알파벳

grape.store 2021. 8. 20. 20:49
반응형

백준 알파벳 문제

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

 

1987번: 알파벳

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으

www.acmicpc.net

 

백준 1987 알파벳

- 첫 풀이(시간초과)

import sys


r, c = map(int,sys.stdin.readline().split())
matrix = []
for i in range(r):
    arr=[]
    temp = sys.stdin.readline().rstrip()
    for j in temp:
        arr.append(j)
    matrix.append(arr)


def dfs(start,visited2=[]):
    global maximum
## 방문한 알파벳 'A'등을 추가해줌 ##
    visited2.append(matrix[start[0]][start[1]])
## 방문한 알파벳 길이를 계속 업데이트 하여 최대값을 찾는다 ##
    if len(visited2) > maximum:
        maximum = len(visited2)
## matrix에서 현재위치와 연결된 다음 위치를 (x,y)리스트를 넣어줌 ##
    for node in graph[start[0],start[1]]:
        if matrix[node[0]][node[1]] not in visited2:
## node = [0,1]과같이 matrix위치로 구성되어있으며 다음 dfs로 recursion한다. ##
            dfs(node,visited2)
## 재귀가 다음 연결지점에 방문하지 못하고 나오면서 현재 저장되었던 알파벳 리스트를 없애줌 ##
## 다른경로로 갈때 새로 방문하여야 하기 때문 ##
            visited2.pop()

dx = [1,-1,0,0]
dy = [0,0,1,-1]
x,y = 0,0
count = 0
graph = dict()
## 딕셔너리 key value구조를 이용하여 node가 어떤 node들과 edge(간선)가 이어져있는지 저장 ##
for i in range(r):
    for j in range(c):
        temp = []
        for k in range(4):
            nx = j + dx[k]
            ny = i + dy[k]
            if nx<0 or nx>=c or ny<0 or ny >= r:
                continue
            else:
                temp.append([ny,nx])
        graph[i,j] = temp
maximum = 0
dfs([0,0])
print(maximum)

- 알파벳을 True False check를 이용하여(시간초과)

import sys

def aToIdx(a):
    return ord(a)-ord('A')


r, c = map(int,sys.stdin.readline().split())
matrix = []
g = [[] for _ in range(r)]
visited = [[False] * r for N in range(c)]
for i in range(r):
    g[i] = [aToIdx(x) for x in sys.stdin.readline().rstrip()]


def dfs(start,depth):
    global maximum
    if maximum == 26:
        return
    maximum = max(maximum,depth)
    for node in graph[start[0],start[1]]:
        v = g[node[0]][node[1]]
        if not visited[node[0]][node[1]] and not alpha[v]:
            alpha[v] = True
            visited[node[0]][node[1]] = True
            dfs(node,depth+1)
            visited[node[0]][node[1]] = False
            alpha[v] = False


dx = [1,-1,0,0]
dy = [0,0,1,-1]
x,y = 0,0
graph = dict()
for i in range(r):
    for j in range(c):
        temp = []
        for k in range(4):
            nx = j + dx[k]
            ny = i + dy[k]
            if nx<0 or nx>=c or ny<0 or ny >= r:
                continue
            else:
                temp.append([ny,nx])
        graph[i,j] = temp
maximum = 0
alpha = [False]*26
alpha[g[0][0]] = True
visited[0][0] = True
dfs([0,0],1)
print(maximum)

'백준' 카테고리의 다른 글

python 백준 11725번 트리의 부모 찾기  (0) 2021.08.21
python 백준 3055번 탈출  (0) 2021.08.20
python 백준 7569번 토마토  (0) 2021.08.20
python 백준 2630 색종이 만들기  (0) 2021.08.15
python 백준 2470번 두 용액  (0) 2021.08.15
Comments