백준/Search
[dfs/백준] 2210번 : 숫자판 점프
ydin
2022. 7. 30. 10:59
- 문제 : https://www.acmicpc.net/problem/2210
Silver Level2 문제
행렬의 크기가 5x5라서 완전탐색을 하면서 각 위치에서 5번 이동해서 만든 6자리 수를 비교하려고 했다
처음에는 global temp를 선언한뒤 움직일때마다 숫자를 temp에 붙이는 식으로 생각했는데,
dfs로 진행하다보니 그렇게 하면 하나의 케이스를 온전히 못 담기도 하고, 메모리 초과가 난다
그래서 하나의 깊이마다 temp를 담기 위해 temp 파라미터를 추가한 후 그 길이가 6일 때 dfs를 멈춘다
중복된 숫자를 넣지 않는 방법은 다음 코드를 작성하면 된다
if not temp in answer:
다음에서 return을 두번째 if 안에서 안 하고, 첫번째 안에서 하는지 궁금했다.
생각해보니까, 일단 길이가 6이 되면 그 탐색은 끝나는건데, 중복된 것이 있으면 answer에 넣지 않은 상태에서 끝나는거고, 중복된 것이 없으면 answer에 삽입하고 끝나는 거니까 그 두가지 경우를 모두 생각해서 return의 위치가 정해진 것 같다.
만약 두번 째 if 안에 return이 있으면 중복된 경우 멈추지 않으니까 (내 생각이고, 틀릴 수도 있다)
이 생각을 기반으로 정답 풀이 코드를 조금 고쳤다. 이렇게 작성해도 정답이 뜬다
if len(temp)==6:
if not temp in answer:
answer.append(temp)
return
- 정답 풀이 :
import sys
input=sys.stdin.readline
sys.setrecursionlimit(10**6)
data=[]
for _ in range(5):
data.append(list(input().split()))
dx=[-1,1,0,0]
dy=[0,0,-1,1]
answer=[]
def dfs(x,y,temp):
if len(temp)==6:
if temp not in answer:
answer.append(temp)
return
else: #중복되는 결과는 그냥 반환하기
return
for i in range(4):
nx,ny=x+dx[i],y+dy[i]
if 0<=nx<5 and 0<=ny<5:
num=temp+data[nx][ny]
dfs(nx,ny,num)
for i in range(5):
for j in range(5):
dfs(i,j,data[i][j])
print(len(answer))
- 시도해본 풀이 :
메모리 초과로 실패했다
import sys
sys.setrecursionlimit(10**6)
data=[]
for _ in range(5):
data.append(list(input().split()))
dx=[-1,1,0,0]
dy=[0,0,-1,1]
answer=[]
temp=''
def dfs(x,y):
global temp
if len(temp)==6:
return temp
for i in range(4):
nx,ny=x+dx[i],y+dy[i]
if 0<= nx < 5 and 0 <= ny < 5 :
temp += data[nx][ny]
dfs(nx,ny)
for i in range(5):
for j in range(5):
result=dfs(i,j)
if result not in answer:
answer.append(result)
print(len(answer))