[백준 문제] 14890번 경사로 (파이썬)
[백준 문제] 14890번 경사로 (파이썬)
[백준 문제] 14890번 경사로를 풀어본다.
나의 생각의 흐름
- 두칸씩 보면서 3가지 케이스를 만들었다.
- 두칸이 다 같은 층인지
- 한칸 위로 가는지
- 한칸 아래로 가는지
- 그리고 3가지 케이스 별로 다음 스텝을 생각했다.
- 두칸이 다같다면 -> 한칸씩 넘어가면서 체크
- 한칸 위로 가면 -> 경사 만들어 주기
- 한칸 아래로 가면 -> 경사 만들어 주기
깨달은점
- 괜한 쓰잘대기 없는 편법 쓰려다 시간이 너무 많이 지체됨
- def / class 사용법을 좀 익혀서 코드 정리가 잘 되어야할 것 같음
내 풀이 (성공)
# 데이터 넣기
n, l = map(int, input().split())
map_lst = []
for _ in range(n) :
map_lst.append(list(map(int, input().split())))
# 열로 체크할때 코드 짜기 귀찮으니까 미리 transpse해주기
map_lst_trans = list(map(list, zip(*map_lst)))
# 갈 수 있는 루트 만들기
go_lst = []
for i in range(8) :
go_lst.append([i+1]*l+[i+2])
go_lst.append([i+2]+[i+1]*l)
cnt = 0
# 행으로 체크
for check_lst in map_lst :
slope_launch_lst = [True] * n
i = 0
try :
while True :
if i == n-1:
cnt += 1
break
# 경사가 위로
if check_lst[i] == check_lst[i+1] - 1 :
if check_lst[i-l+1:i+2] in go_lst and slope_launch_lst[i-l+1:i+1] == [True]*l :
slope_launch_lst[i - l + 1:i + 1] = [False] * l
i += 1
else :
break
# 경사가 아래로
elif check_lst[i] == check_lst[i+1] + 1 :
if check_lst[i:i+l+1] in go_lst and slope_launch_lst[i+1:i+l+1] == [True]*l:
slope_launch_lst[i + 1:i + l + 1] = [False] * l
i += l
else :
break
# 경사 없음
elif check_lst[i] == check_lst[i + 1] :
i += 1
# 위 3개 케이스에 해당 안함
else :
break
except IndexError :
continue
# 열로 체크
for check_lst in map_lst_trans :
slope_launch_lst = [True] * n
i = 0
try :
while True :
if i == n-1:
cnt += 1
break
# 경사가 위로
if check_lst[i] == check_lst[i+1] - 1 :
if check_lst[i-l+1:i+2] in go_lst and slope_launch_lst[i-l+1:i+1] == [True]*l :
slope_launch_lst[i - l + 1:i + 1] = [False] * l
i += 1
else :
break
# 경사가 아래로
elif check_lst[i] == check_lst[i+1] + 1 :
if check_lst[i:i+l+1] in go_lst and slope_launch_lst[i+1:i+l+1] == [True]*l:
slope_launch_lst[i + 1:i + l + 1] = [False] * l
i += l
else :
break
# 경사 없음
elif check_lst[i] == check_lst[i + 1] :
i += 1
# 위 3개 케이스에 해당 안함
else :
break
except IndexError :
continue
print(cnt)