# 14890번 – 경사로

## 문제

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

## 코드

``````from copy import deepcopy
n, l = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
height, width, RIGHT, LEFT, 경사로 = (n, n, 1, -1, '#')
record = [*width for _ in range(height)]

def 보드돌리기(board):
B = [*width for _ in range(height)]
for x in range(width):
for y in range(height):
B[x][y] = board[y][x]
return B

def 경사로를놓을수있는가(board, y, fromX, toX, LR):
if LR == RIGHT:
# l이 1인경우는 따로 처리를 해준다
if l == 1:
if record[y][fromX] == 경사로: return False
else:
record[y][fromX] = 경사로
return True

for x in range(fromX, toX):
if 경사로 in [record[y][x], record[y][x+1]]: return False
diff = board[y][x] - board[y][x+1]
if diff != 0: return False
for x in range(fromX, toX+1): record[y][x] = 경사로
return True

elif LR == LEFT:
# l이 1인경우는 따로 처리를 해준다
if l == 1:
if record[y][fromX] == 경사로: return False
else:
record[y][fromX] = 경사로
return True

for x in range(fromX, toX, -1):
if 경사로 in [record[y][x-1], record[y][x]]: return False
diff = board[y][x] - board[y][x-1]
if diff != 0: return False
for x in range(fromX, toX, -1): record[y][x] = 경사로
return True

def 가로확인(board):
count = 0
for y in range(height):
OK = True
for x in range(width-1):
diff = board[y][x] - board[y][x+1]
if abs(diff) > 1: OK = False
elif diff == 1:
if x+l >= width: OK = False
else: OK = 경사로를놓을수있는가(board, y, x+1, x+l, RIGHT)
elif diff == -1:
if x-(l-1) < 0: OK = False
else: OK = 경사로를놓을수있는가(board, y, x, x-(l-1), LEFT)
if OK is False: break
if OK is True: count += 1
return count