chldkato

백준 14890 경사로 (파이썬) 본문

백준

백준 14890 경사로 (파이썬)

chldkato 2020. 4. 16. 17:57

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

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

1. 가로, 세로 방향으로 이동 가능한지 검사한다

2. 경사로를 배치했는지 검사하는 리스트 c를 만든다

3. 이동할 때 다음 칸과의 차이가 1보다 크면 return한다

4. 오르막길일 경우 길이 l 만큼 오르막길을 배치할 수 있는지 확인한다

5. 내리막길일 경우 다음 칸 부터 시작해서 길이 l 만큼 내리막길을 배치할 수 있는지 확인한다

6. 끝까지 도착하면 1을 return해서 경사로 개수를 증가시킨다

import sys

input = sys.stdin.readline

def garo(i):
    c = [0 for _ in range(n)]
    for j in range(n-1):
        if abs(a[i][j] - a[i][j + 1]) > 1:
            return 0

        if a[i][j] < a[i][j + 1]:
            temp = [0 for _ in range(n)]
            for k in range(l):
                if j - k < 0:
                    return 0
                if a[i][j] != a[i][j - k] or c[j - k] != 0:
                    return 0
                temp[j - k] = 1
            c = temp

        elif a[i][j] > a[i][j + 1]:
            temp = [0 for _ in range(n)]
            for k in range(l):
                if j + k + 1 >= n:
                    return 0
                if a[i][j + 1] != a[i][j + k + 1] or c[j + k + 1] != 0:
                    return 0
                temp[j + k + 1] = 1
            c = temp
    return 1


def sero(j):
    c = [0 for _ in range(n)]
    for i in range(n-1):
        if abs(a[i][j] - a[i + 1][j]) > 1:
            return 0

        if a[i][j] < a[i + 1][j]:
            temp = [0 for _ in range(n)]
            for k in range(l):
                if i - k < 0:
                    return 0
                if a[i][j] != a[i - k][j] or c[i - k] != 0:
                    return 0
                temp[i - k] = 1
            c = temp

        elif a[i][j] > a[i + 1][j]:
            temp = [0 for _ in range(n)]
            for k in range(l):
                if i + k + 1 >= n:
                    return 0
                if a[i + 1][j] != a[i + k + 1][j] or c[i + k + 1] != 0:
                    return 0
                temp[i + k + 1] = 1
            c = temp
    return 1


n, l = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]

ans = 0
for i in range(n):
    ans += garo(i)
    ans += sero(i)
print(ans)

Comments