-
BOJ 17069 파이프 옮기기 2(python 3)알고리즘/BOJ 2019. 4. 11. 02:41반응형
파이프 옮기기 2의 코드는 python 3으로 제출해도 됩니다.
파이프 옮기기 2는 1과 다르게 시간 제한이 1초에서 0.5초로 줄어들었고, N의 범위가 3~16에서 3~32로 늘어났습니다.
이 문제는 DP로 풀 수 있습니다.
이번엔 칸에 칠해진 색깔과 파이프의 색깔을 살펴봐야합니다.
노란색 파이프(→)처럼 놓일려면 아래 두 방법중에 하나를 이용해야 합니다.(배열 좌표는 x, y라고 가정)
1) x, y-1인 노란색 파이프(→)
2) x, y-1인 파란색 파이프(↘)
파란색 파이프(↘)처럼 놓일려면 아래 세 방법중에 하나를 이용해야 합니다.
1) x-1, y-1인 노란색 파이프(→)
2) x-1, y-1인 파란색 파이프(↘)
3) x-1, y-1인 초록색 파이프(↓)
초록색 파이프(↓)처럼 놓일려면 아래 두 방법중에 하나를 이용해야 합니다.
1) x-1, y인 파란색 파이프(↘)
2) x-1, y인 초록색 파이프(↓)
각각 파이프처럼 놓일려면 위에 나온 방법을 각각 전부 더해주면 됩니다.
완성된 코드는 이렇습니다.
123456789101112131415n = int(input())D = [[*map(int, input().split())] for _ in range(n)]S = [[[0] * 3 for _ in range(n)] for __ in range(n)]S[0][1][0] = 1for i in range(2, n):if D[0][i] == 1: breakS[0][i][0] = 1for i in range(1, n):for j in range(2, n):# → 0 ,↘ 1, ↓ 2if D[i][j] == 0:S[i][j][0] = S[i][j - 1][0] + S[i][j - 1][1]S[i][j][2] = S[i - 1][j][1] + S[i - 1][j][2]if D[i - 1][j] == D[i][j - 1] == 0:S[i][j][1] = sum(S[i - 1][j - 1])print(sum(S[n - 1][n - 1]))cs 5~7줄에 대해 설명하자면 맨 윗 줄은 전부 노란색 파이프 밖에 설치하지 못하니 그 점을 이용해서 맨 윗줄은 벽을 만나지 않을 때 까지 값을 설정해줍니다.
이렇게 설정해주면 범위 체크를 해주지 않아도 됩니다.
반응형'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ 5585, C++] 거스름돈 (0) 2021.07.26 [BOJ 2810, C++] 컵홀더 (0) 2021.07.26 BOJ 17070 파이프 옮기기 1(python 3) (0) 2019.04.11 BOJ 17135 캐슬 디펜스(Python 3) (0) 2019.04.08 BOJ 13905 세부(Python 3) (0) 2019.03.12