# 경사로
import sys
input = sys.stdin.readline
N, L = map(int, input().split())
arr = []
for _ in range(N):
arr.append(list(map(int, input().split())))
result = 0
def check(line):
global result
isOK = True
isSlope = [False] * N
for i in range(N-1):
if line[i] == line[i+1]:
continue
elif abs(line[i] - line[i+1]) >= 2:
isOK = False
break
elif abs(line[i] - line[i+1]) == 1:
if slope_check(line, i, isSlope):
continue
else:
isOK = False
break
if isOK:
result += 1
def slope_check(line, i, isSlope):
n = 0
if line[i] > line[i+1]:
temp = line[i+1]
i = i+1
while 0 <= i < N and n < L and not isSlope[i]:
if line[i] == temp:
isSlope[i] = True
n += 1
else:
break
i += 1
elif line[i] < line[i+1]:
temp = line[i]
while 0 <= i < N and n < L and not isSlope[i]:
if line[i] == temp:
isSlope[i] = True
n += 1
else:
break
i -= 1
if n == L:
return True
return False
# row 체크
for i in range(N):
check(arr[i])
# column 체크
for j in range(N):
temp = []
for i in range(N):
temp.append(arr[i][j])
check(temp)
print(result)
구현
1. row와 column의 각각의 줄마다 이동이 가능한 라인인지 확인(check 함수)
- 현재위치와 다음위치를 비교
- 같으면 다음 다음 위치로 이동
- 2이상 차이가 나면 불가능(경사로 높이는 1이기에)
- 1 차이가 나면 경사로를 넣을 수 있는지 체크 (slope 함수)
2. slope 함수
- 올라가는 길이라면 이전 길을 체크하면서 L길이인 경사로를 설치 할 수 있는지 확인
- 내려가는 길이라면 이후 길을 체크하면서 L길이인 경사로를 설치 할 수 있는지 확인
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 14501번 - 퇴사 (파이썬) (0) | 2022.01.27 |
---|---|
[백준] 15685번 - 드래곤 커브 (파이썬) (0) | 2022.01.26 |
[백준] 1655번 - 가운데를 말해요 (파이썬) (0) | 2022.01.26 |
[백준] 2573번 - 빙산 (파이썬) (0) | 2022.01.25 |
[백준] 1238번 - 파티 (파이썬) (0) | 2022.01.25 |