본문 바로가기

PS/BOJ

[BOJ 14890] 경사로 파이썬

풀이

1. 총 2N개의 길로 이루어져 있다. 그래서 각 길(리스트)을 인수로 받아 해당 길을 지나갈 수 있는지 없는지를 판단하는 함수를 만들기로 생각했습니다.

(이 때 조금 고민이 되었던 부분은 2차원 배열을 입력받는데, 행의 길은 이미 리스트로 묶여 있으므로 쉬운데, 열의 길은 어떻게 처리해야 할까 고민이 조금 되었습니다. zip을 사용할 수 있을까 했는데 결론적으로는 다음의 코드와 같이 temp로 일일이 묶어 가며 해결해주었습니다.)

for i in range(N):
    temp = []
    for j in range(N):
        temp.append(graph[j][i])
    if isPossible(temp):
        cnt += 1

2. 경사로를 놓기 위해 판단해야 하는데, 문제는 11122와 같이 올라가는 경우가 있었고 22111과 같이 내려갈 수 있는 경우가 있습니다. (둘 다 경사로 놓는 것은 가능)

더 작은 높이가 L개 있는지 판단해주기 위해, 22111과 같이 내려가는 경우에는 <높이가 1만큼 낮아지면> 이라는 조건 이후에 개수를 세어주면 되지만 거꾸로 된 경우에는 미리 세어주다가 <높이가 1만큼 커지면> 여태 세었던 칸들이 L개가 되느냐 라고 해야하는 것밖에 떠올리지 못했습니다. 그런데 <높이가 1만큼 커지면> 해당 순간부터 for문의 -1을 사용해서 앞으로 가면서 체크해주는 방법이 있었습니다.

 

3. 한 길을 쭉 가면서 체크를 해주어야 했기 때문에 while을 사용하는 방법밖에 떠오르지가 않았습니다. 그런데 for문을 L만큼으로 사용해서 경사로를 놓는 위치마다 visited처럼 체크를 해주는 방식으로 풀 수 있습니다.

 

4. 리스트에서 두 개씩 값을 비교할 때는 범위가 넘어가지 않도록 주의해야합니다.

for i in range(N-1):
	graph[i]와 graph[i+1]비교

총 N개의 원소라면 i와 i+1 로 2개를 비교하는 경우 N-1 전까지 비교해주어야 합니다.

 

N, L = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]

def isPossible(road):
    slope = [0]*N
    for i in range(N-1):
        if road[i] == road[i+1]:
            continue

        if abs(road[i] - road[i+1]) >= 2:
            return False

        # 한 칸 작아졌을 때
        if road[i] > road[i+1]:
            temp = road[i+1]
            for j in range(i+1, i+1+L):
                if 0 <= j < N:
                    if road[j] != temp:
                        return False
                    if slope[j] == 1:
                        return False
                    slope[j] = 1
                else:
                    return False

        # 한 칸 커졌을 때
        elif road[i] < road[i+1]:
            temp = road[i]
            for j in range(i, i-L, -1):
                if 0 <= j < N:
                    if road[j] != road[i]:
                        return False
                    if slope[j] == 1:
                        return False
                    slope[j] = 1
                else:
                    return False

    return True
    
cnt = 0
for g in graph:
    if isPossible(g):
        cnt += 1

for i in range(N):
    temp = []
    for j in range(N):
        temp.append(graph[j][i])
    if isPossible(temp):
        cnt += 1

print(cnt)