티스토리 뷰

알고리즘 공부/백준

백준 17070번

_Yunhwan 2022. 10. 26. 22:57

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

 

17070번: 파이프 옮기기 1

유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의

www.acmicpc.net

n = int(input())
g= []

for i in range(n):
  row = list(map(int,input().split()))
  g.append(row)

dp = []

for i in range(n):
  row = [[0]*3 for j in range(n)]
  dp.append(row)

# 가로, 대각선, 세로
move = [[0,1],[1,1],[1,0]]
dp[0][1][0]=1

 
for i in range(n):
  for j in range(n):
    #3가지 방향 조회
    for k in range(3):
      dx = i +move[k][0]
      dy = j +move[k][1]

      # 범위 밖이거나 벽이면 continue
      if dx<0 or dx>=n or dy<0 or dy>=n or g[dx][dy]==1:
        continue
      # 대각선 이동시 벽에 닿을 때
      if k==1 and (g[dx-1][dy]==1 or g[dx][dy-1]==1):
        continue

      #가로일 때
      if k==0:
        if dp[i][j][0]:
          dp[dx][dy][k]+=dp[i][j][0]
        if dp[i][j][1]:
          dp[dx][dy][k]+=dp[i][j][1]
      
      #대각선일 때
      if k==1:
        if dp[i][j][0]:
          dp[dx][dy][k]+=dp[i][j][0]
        if dp[i][j][1]:
          dp[dx][dy][k]+=dp[i][j][1]
        if dp[i][j][2]:
          dp[dx][dy][k]+=dp[i][j][2]

      #세로일 때
      if k==2:
        if dp[i][j][1]:
          dp[dx][dy][k]+=dp[i][j][1]
        if dp[i][j][2]:
          dp[dx][dy][k]+=dp[i][j][2]
        

print(sum(dp[n-1][n-1]))

다이나믹 프로그래밍 문제

각 칸마다 3가지 방향에 대한 저장소를 생성

 

3가지 방향

아래 상황일 때만 가능

가로: 가로→가로, 가로→대각선

대각선: 대각선→가로, 대각선→대각선, 대각선→세로

세로: 세로→대각선, 세로→세로

해당되는 상황일 때만 이전 위치의 값을 새로운 위치에 더해줌

'알고리즘 공부 > 백준' 카테고리의 다른 글

백준 17086번  (0) 2022.10.29
백준 1062번  (0) 2022.10.27
백준 1806번  (0) 2022.10.27
백준 12869번  (0) 2022.10.26
백준 16953번  (0) 2022.10.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함