✅문제
✅문제 풀이
한 열과 행을 체크하면서 지나갈수 있는 길이 아닌 것을 체크하여서 코딩한다.
1. 인접한 칸의 차이가 2 이상이 날때 False 반환
2. 차이가 1, 다음 칸의 숫자가 더 클때
1) 인덱스가 0 이하로 떨어질때 False 반환
2) 경사로 만큼의 이전 칸으로 갔을시 값이 다를 때 False 반환
3) 경사로를 이미 설치한 곳이면 False 반환
3. 차이가 1, 다음 칸의 숫자가 더 작을때
1) 인덱스가 n 이상으로 올라갈 때 False 반환
2) 경사로 만큼의 이전 칸으로 갔을시 값이 다를 때 False 반환
3) 경사로를 이미 설치한 곳이면 False 반환
을 그대로 구현한다.
다 풀고 나니 함수를 하나로 일차원 배열로 만들고
dc = a[i]
또하나는
dr = [a[i][j] for i in range(n)]로 하면 함수하나를 더 쓸 필요가 없는 것 같다 ㅠㅠ
✅Code
#import sys
#sys.stdin = open('D:/test.txt', 'r')
n, l = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
ans = 0
def dr(a, l, b):
n = len(a)
r = [False]*n
for i in range(1, n):
if a[i-1][b] != a[i][b]:
sub = abs(a[i-1][b]-a[i][b])
if sub != 1:
return False
elif a[i-1][b] < a[i][b]:
for j in range(1, l+1):
if i-j < 0:
return False
elif a[i-1][b] != a[i-j][b]:
return False
elif r[i-j]:
return False
r[i-j] = True
else:
for j in range(l):
if i+j >= n:
return False
elif a[i][b] != a[i+j][b]:
return False
elif r[i+j]:
return False
r[i+j] = True
return True
def dc(a, l, b):
n = len(a[0])
c = [False]*n
for i in range(1, n):
if a[b][i-1] != a[b][i]:
sub = abs(a[b][i-1] - a[b][i])
if sub != 1:
return False
elif a[b][i-1] < a[b][i]:
for j in range(1, l+1):
if i-j < 0:
return False
elif a[b][i-1] != a[b][i-j]:
return False
elif c[i-j]:
return False
c[i-j] = True
else:
for j in range(l):
if i+j >= n:
return False
elif a[b][i] != a[b][i+j]:
return False
elif c[i+j]:
return False
c[i+j] = True
return True
for i in range(n):
if dr(a, l, i):
ans += 1
for i in range(n):
if dc(a, l, i):
ans += 1
print(ans)
'알고리즘 > 구현' 카테고리의 다른 글
[백준] 4673번 : 셀프 넘버(python) (1) | 2023.10.26 |
---|---|
[백준] 15662번 : 톱니바퀴(2) 풀이(python) (1) | 2023.10.19 |
[백준] 14503번 : 로봇 청소기 풀이(python) (1) | 2023.10.19 |
[백준] 14499번 : 주사위 굴리 풀이(python) (1) | 2023.10.19 |