[백준 문제] 14890번 경사로 (파이썬)


[백준 문제] 14890번 경사로 (파이썬)

[백준 문제] 14890번 경사로를 풀어본다.

나의 생각의 흐름

  • 두칸씩 보면서 3가지 케이스를 만들었다.
    1. 두칸이 다 같은 층인지
    2. 한칸 위로 가는지
    3. 한칸 아래로 가는지
  • 그리고 3가지 케이스 별로 다음 스텝을 생각했다.
    1. 두칸이 다같다면 -> 한칸씩 넘어가면서 체크
    2. 한칸 위로 가면 -> 경사 만들어 주기
    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)





© 2018. by statssy

Powered by statssy