본문 바로가기
Algorithm/BOJ

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

by _temp 2022. 1. 26.

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

# 경사로
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길이인 경사로를 설치 할 수 있는지 확인