Algorithm (PS)

[백준] 14890번 경사로 Python 구현문제

minjiwoo 2023. 1. 13. 13:28
728x90

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

 

14890번: 경사로

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

www.acmicpc.net

원래는 row 별 갈수 있는 길, column 별 갈 수 있는길을 각각 함수로 만들어줄까 했다. 

그래서 원래는 row 체크중이면 type 1 column 체크중이면 type2로 할까했는데.. 생각해보니까 

 check_row 함수를 재활용하고 배열을 90도 시계방향으로 돌려서 array를 parameter로 전달하면 될것 같아서 따로 column 을 확인하는 함수를 만들지 않았다 (사실 귀찮아서..)

그래서 코드에 저 type 변수는 무시해도 된다..

new_array = list(map(list, zip(*array[::-1])))

이게 90도 시계방향으로 돌리는 코드이다 

n, length = map(int, input().split())
array = []
for i in range(n):
    array.append(list(map(int, input().split())))
answer = 0
visited = [[False] * n for _ in range(n)]

def is_in_range(x, y):
    if 0 <= x < n and 0 <= y < n:
        return True
    else:
        return False

def check_further(x, y, type, array):
    if type == 1: # row
        for i in range(1, length+1):
            if is_in_range(x, y+i):
                if array[x][y] -1 == array[x][y+i] and not visited[x][y+i]:
                    visited[x][y + i] = True
                else:
                    return False
            else:
                return False
        return True

def check_before(x, y, type, array):
    if type == 1:
        for i in range(1, length):
            if is_in_range(x, y-i):
                if array[x][y] == array[x][y-i] and not visited[x][y-i]:
                    visited[x][y-i] = True
                else:
                    return False
            else:
                return False
        return True

def check_row(array):
    global answer
    for i in range(n):
        flag = True
        for j in range(n-1):
            if array[i][j] == array[i][j+1]:
                continue
            if array[i][j]-1 == array[i][j+1]:
                if not visited[i][j+1]:
                    if check_further(i, j, 1, array):
                        visited[i][j + 1] = True
                    else:
                        flag = False
                        break
                else:
                    flag = False
                    break
            if array[i][j]+1 == array[i][j+1]:
                if not visited[i][j]:
                    if check_before(i, j, 1, array):
                        visited[i][j] = True
                    else:
                        flag = False
                        break
                else:
                    flag = False
                    break
            if abs(array[i][j] - array[i][j+1]) > 1:
                flag = False
                break
        if flag:
            answer += 1
check_row(array)
visited = [[False] * n for _ in range(n)]
# 90도 회전하기 시계방향으로
new_array = list(map(list, zip(*array[::-1])))

check_row(new_array)

print(answer)
728x90