https://www.acmicpc.net/problem/17070
17070번: 파이프 옮기기 1
유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 번호이고, 행과 열의 번호는 1부터 시작한다. 각각의 칸은 빈 칸이거나 벽이다. 오늘은 집 수리를 위해서 파이프 하나를 옮기려고 한다. 파이프는 아래와 같은 형태이고, 2개의 연속된 칸을 차지하는 크기이다. 파이프는 회전시킬 수 있으며, 아래와 같이
www.acmicpc.net


이전에 풀었던 '등굣길' 형태의 길찾기 문제의 심화 버전 느낌이었다.
[Python] 프로그래머스. 등굣길 (Level 3)
https://programmers.co.kr/learn/courses/30/lessons/42898 코딩테스트 연습 - 등굣길 | 프로그래머스 계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에..
inspirit941.tistory.com
좌표평면에서 해당 좌표까지 도착하는 방법의 개수를 구하면 되는데, 좌표에 도달하는 방법의 개수가 3개라는 차이점이 있다.
따라서 가로로 도착하는 경우 / 세로로 도착하는 경우 / 대각선으로 도착하는 경우 세 가지로 나눠서 생각해야 하며,
[y좌표][x좌표][도착하는 방법] 3차원 리스트로 만들어 해결했다.
현재 좌표를 x, y라고 하면
가로 모양의 현재 좌표 = 가로 모양 (x-1, y) 좌표까지 이동한 방법 + 대각선 모양 (x-1, y) 좌표까지 이동한 방법
세로 모양의 현재 좌표 = 세로 모양 (x, y-1) 좌표까지 이동한 방법 + 대각선 모양 (x, y-1) 좌표까지 이동한 방법
이 된다.
대각선은 가로 -> 대각선, 세로 -> 대각선, 대각선 -> 대각선 세 가지 형태가 있으므로
대각선 모양의 현재 좌표 = 가로 모양 (x-1, y-1) 좌표까지 이동한 방법 + 대각선 모양 (x-1, y-1) 좌표까지 이동한 방법 + 세로 모양 (x-1, y-1) 좌표까지 이동한 방법이 된다.
import sys | |
n = int(sys.stdin.readline()) | |
maps = [list(map(int, sys.stdin.readline().split())) for _ in range(n)] | |
# 가로, 세로, 대각선의 idx를 각각 0, 1, 2로 설정. | |
table = [[[0]*3 for _ in range(n)] for _ in range(n)] | |
# 파이프의 오른쪽 끝만 도착하면 되기 때문에, 파이프 오른쪽을 기준으로 설정 | |
table[0][1][0] = 1 | |
# 첫 위치에서 가로로만 이동하는 방법의 개수 | |
for x in range(2, n): | |
if maps[0][x] == 0: | |
table[0][x][0] = table[0][x-1][0] | |
# 이동하기 | |
for y in range(n): | |
# x는 idx 1에서부터 출발하고, x가 idx 1로 되돌아가는 방법은 없다. | |
# 가로 -> 대각선 -> 세로를 최소한 한 번은 거쳐야 하기 때문 | |
for x in range(2, n): | |
# 가로, 세로, 대각선 어디에서든 대각선으로 머리를 변경할 수 있다. | |
# 대각선으로 이동할 수 있는 경우 | |
if maps[y][x] == maps[y][x-1] == maps[y-1][x] == 0: | |
table[y][x][2] = table[y-1][x-1][0] + table[y-1][x-1][1] + table[y-1][x-1][2] | |
# 다음 칸으로 움직일 수 있는 경우 | |
if maps[y][x] == 0: | |
# 가로로 이동하는 경우 = 대각선 -> 가로, 가로 -> 가로 | |
table[y][x][0] = table[y][x-1][2] + table[y][x-1][0] | |
# 세로로 움직이는 경우 = 대각선 -> 세로, 세로 -> 세로 | |
table[y][x][1] = table[y-1][x][2] + table[y-1][x][1] | |
print(sum(table[-1][-1])) | |
'프로그래밍 > 코딩테스트 문제풀이' 카테고리의 다른 글
[Python] 백준 14891. 톱니바퀴 (1) | 2020.01.05 |
---|---|
[Python] 백준 17135. 캐슬 디펜스 (0) | 2020.01.04 |
[Python] 백준 1316. 그룹 단어 체커 (0) | 2020.01.02 |
[Python] 프로그래머스. 거스름돈 (Level 3) (1) | 2020.01.01 |
[Python] 백준 14501. 퇴사 (0) | 2019.12.31 |