[파이썬] 백준 1405 : 미친로봇 (골드4)
1405번: 미친 로봇
첫째 줄에 N, 동쪽으로 이동할 확률, 서쪽으로 이동할 확률, 남쪽으로 이동할 확률, 북쪽으로 이동할 확률이 주어진다. N은 14보다 작거나 같은 자연수이고, 모든 확률은 100보다 작거나 같은 자
www.acmicpc.net
문제
풀이
0. 방향성 생각
- 백트래킹 기본 4**14 = 2*28 = 250만 탐색 경우의수 많다 -> 백트래킹 가지치기
1. 입력
temp = list(map(int, input().split()))
n,prob = temp[0],list(map(lambda x: x/100, temp[1:]))
visit = [[False]*29 for _ in range(29)]
visit[14][14] = True
step = [(1,0),(-1,0),(0,1),(0,-1)]
count = 0
- 이동할 수 있는 배열 visit에 False 할당
- 원점 14,14를 True로 하고 동서남북 인덱스에 맞게 step 지정
2. DFS 함수 정의
def dfs(x,y,t,p):
global count
if t == n:
count += p
return
for i in range(4):
dx,dy = step[i]
nx,ny = x+dx, y+dy
if not visit[ny][nx]:
visit[ny][nx] = True
dfs(nx,ny,t+1,p*prob[i])
visit[ny][nx] = False
dfs(14,14,0,1.0)
print(count)
- 안겹치고 마지막에 도달하면 확률을 count에 더해준다.
전체코드
temp = list(map(int, input().split()))
n,prob = temp[0],list(map(lambda x: x/100, temp[1:]))
visit = [[False]*29 for _ in range(29)]
visit[14][14] = True
step = [(1,0),(-1,0),(0,1),(0,-1)]
count = 0
def dfs(x,y,t,p):
global count
if t == n:
count += p
return
for i in range(4):
dx,dy = step[i]
nx,ny = x+dx, y+dy
if not visit[ny][nx]:
visit[ny][nx] = True
dfs(nx,ny,t+1,p*prob[i])
visit[ny][nx] = False
dfs(14,14,0,1.0)
print(count)
코멘트
백트래킹 기본
다시 풀어봤는데 set 이용해서 방문처리 했는데 map size가 크지 않아서 훨씬 느려지긴 했음
set이랑 dict은 웬만하면 피하자
'Algorithm > etc' 카테고리의 다른 글
[파이썬] 백준 22945 : 팀 빌딩 (골드4) (0) | 2023.12.12 |
---|---|
[파이썬] 프로그래머스 : 모음사전 (Lv.2) (0) | 2023.11.30 |
[파이썬] 프로그래머스 : 타겟 넘버 (Lv.2) (0) | 2023.11.10 |
[파이썬] 백준 1234 : 크리스마스 트리 (골드2) (0) | 2023.11.05 |
[파이썬] 백준 17825 : 주사위 윷놀이 (골드2) (0) | 2023.10.22 |
[파이썬] 백준 14391 : 종이 조각 (골드3) (0) | 2023.10.22 |
[파이썬] 프로그래머스 : 불량 사용자 (Lv.3) (0) | 2023.10.13 |
댓글