백준|14890번|경사로

README·2022년 7월 31일
0

파이썬 PS풀이

목록 보기
72/136

문제설명
크기가 N*N인 지도에서 다양한 높이의 칸들이 있을 때 경사로를 놓아서 완주할 수 있는 경로가 몇개인지를 출력하는 문제입니다.
경사로를 놓는 규칙
1. 경사로를 놓기 위해서는 같은 높이의 칸이 M개이어져있어야함
2. 경사로를 놓기 위해서는 두 칸의 높이의 차이가 1이어야함
3. 경사로를 놓는 칸은 두 칸중 낮은 칸임
4. 경사로가 놓여있는칸은 다른 경사로를 놓을 수 없음

작동 순서
1. 맵의 크기 N과 경사로를 놓기 위해 필요한 칸의 길이 M을 입력받습니다.
2. 맵의 구조를 입력받습니다.
3. 가로부터 시작하여 세로 방향으로 경로를 확인합니다.
4. 다음칸이 현재칸과 높이가 같은 경우 그대로 통과합니다.
5. 다음칸이 현재칸보다 높이가 1칸 낮은 경우 다음칸부터 이후 M개의 칸 까지를 확인하여 높이가 모두 같은 경우 그 경로에 경사로를 놓고 이동합니다.
6. 다음칸이 현재칸보다 높이가 1칸 높은 경우 현재칸부터 이전 M개의 칸까지를 확인하여 높이가 모두 같고 놓여있는 경사로가 없는 경우 경사로를 놓고 이동하고 경사로가 있는 경우 해당 경로 탐색을 종료합니다.
7. 다음칸이 현재칸보다 2칸 이상 높거나 낮은 경우 해당 경로 탐색을 종료합니다.
8. 모든 경로를 탐색한 뒤에 완주할 수 있는 경로의 개수를 출력합니다.

소스코드

import sys
N, M = map(int, sys.stdin.readline().split())
loadMap = []
count = 0
for i in range(N):
    loadMap.append(list(map(int, sys.stdin.readline().split())))
for i in range(N):
    runway = [0 for _ in range(N)]
    canThrough = True
    for j in range(N-1):
        if loadMap[i][j] == loadMap[i][j+1]:
            pass
        elif loadMap[i][j]-loadMap[i][j+1] == -1 and runway[j] == 0:
            n = 0
            while n <= M-1:
                if j - n < 0:
                    canThrough = False
                    break
                if loadMap[i][j] != loadMap[i][j - n] or runway[j - n] == 1:
                    canThrough = False
                    break
                if n == M-1:
                    n2 = 0
                    while n2 < M:
                        runway[j - n2] = 1
                        n2 += 1
                n += 1

        elif loadMap[i][j]-loadMap[i][j+1] == 1 and runway[j+1] == 0:
            n = 1
            while n <= M:
                if j + n >= N:
                    canThrough = False
                    break
                if loadMap[i][j + 1] != loadMap[i][j + n]:
                    canThrough = False
                    break
                if n == M:
                    n2 = 0
                    while n2 < M:
                        n2 += 1
                        runway[j + n2] = 1
                n += 1
        else:
            canThrough = False
            break
    if canThrough:
        count += 1

for i in range(N):
    runway = [0 for _ in range(N)]
    canThrough = True
    for j in range(N-1):
        if loadMap[j][i] == loadMap[j+1][i]:
            pass
        elif loadMap[j][i]-loadMap[j+1][i] == -1 and runway[j] == 0:
            n = 0
            while n <= M-1:
                if j - n < 0:
                    canThrough = False
                    break
                if loadMap[j][i] != loadMap[j-n][i] or runway[j - n] == 1:
                    canThrough = False
                    break
                if n == M-1:
                    n2 = 0
                    while n2 < M:
                        runway[j - n2] = 1
                        n2 += 1
                n += 1

        elif loadMap[j][i]-loadMap[j+1][i] == 1 and runway[j+1] == 0:
            n = 1
            while n <= M:
                if j + n >= N:
                    canThrough = False
                    break
                if loadMap[j+1][i] != loadMap[j+n][i]:
                    canThrough = False
                    break
                if n == M:
                    n2 = 0
                    while n2 < M:
                        n2 += 1
                        runway[j + n2] = 1
                n += 1
        else:
            canThrough = False
            break
    if canThrough:
        count += 1
print(count)

후기
요즘 삼성 기출문제 들을 풀어보고 있는데 복잡한 구현 문제가 많은 것 같습니다. 구현 능력을 기르는 것도 중요하고 좀 더 효율적인 알고리즘을 짜는 것도 중요한 것 같습니다. 계속해서 노력해야 할 것 같습니다.

profile
INTP 개발자 지망생

0개의 댓글