본문 바로가기
Problem Solving/Implementation

[구현/파이썬] 백준 14890번: 경사로 / 골드 3

by ggyongi 2022. 4. 12.
반응형

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

 

14890번: 경사로

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

www.acmicpc.net

n, m = map(int, input().split())
table = []
for _ in range(n):
    table.append(list(map(int, input().split())))

rotated = [[0 for _ in range(n)] for _ in range(n)]
for i in range(n):
    for j in range(n):
        rotated[i][j] = table[j][n-1-i]

answer = 0

def check(table):
    global answer
    for i in range(n):
        height = table[i][0]
        stack = 1
        j = 1
        while j < n:
            if height == 0:
                height = table[i][j]
                stack += 1
            elif height == table[i][j]:
                stack += 1
            elif table[i][j] - height == 1:  # 올라갈 수 있는지 체크
                if stack < m:
                    break
                height += 1  # 올라갔다면 높이는 1 증가
                stack = 1    # 올라갔다면 스택은 1로 설정

            elif height - table[i][j] == 1:  # 내려갈 수 있는지 체크
                if j+m > n: break
                front = table[i][j:j+m]

                possible = True
                for f in front:
                    if f != height -1:
                        possible = False
                        break
                if possible:
                    j += m
                    height -= 1   # 내려갔다면 높이는 1 감소
                    stack = 0     # 내려갔다면 스택은 0으로 설정정
                    continue
                else:
                    break
            else:
                break

            j += 1

        if j >= n:
            answer += 1


check(table)
check(rotated)
print(answer)

빡구현은 늘 힘들다.

올라갈 때는 경사로를 이미 다 탔기 때문에 stack이 1이 되어야 하고

내려갈 때는 경사로를 다 타지 않고 경사로의 마지막 칸에 있는 상황이라 stack을 0으로 설정해줘야 한다.

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글