14890: 경사로

ewillwin·2023년 6월 26일
0

Problem Solving (BOJ)

목록 보기
91/230

import sys

N, L = map(int, input().split())
Map = []; Road = []
for n in range(N):
    tmp = list(map(int, sys.stdin.readline()[:-1].split()))
    Map.append(tmp)
    Road.append(tmp)
for i in range(N):
    tmp = []
    for j in range(N):
        tmp.append(Map[j][i])
    Road.append(tmp)

result = 0
for i in range(2 * N):
    tmp_result = True; setted = [False for _ in range(N)]; escape = False
    for j in range(1, N):
        if abs(Road[i][j] - Road[i][j-1]) > 1: #2칸 이상 높아지거나 낮아진 경우
            tmp_result = False; break
        elif Road[i][j-1] - Road[i][j] == 1: #1칸 낮아진 경우 -> 오른쪽 탐색
            for k in range(L):
                if j+k >= N or setted[j+k] or Road[i][j] != Road[i][j+k]:
                    tmp_result = False; escape = True; break
                if Road[i][j] == Road[i][j+k]:
                    setted[j+k] = True
            if escape:
                break
        elif Road[i][j] - Road[i][j-1] == 1: #1칸 높아진 경우 -> 왼쪽 탐색
            for k in range(L):
                if j-k-1 < 0 or setted[j-k-1] or Road[i][j-1] != Road[i][j-k-1]:
                    tmp_result = False; escape = True; break
                if Road[i][j-1] == Road[i][j-k-1]:
                    setted[j-k-1] = True
            if escape:
                break

    if tmp_result:
        result += 1

print(result)
  • 조건 문 분기하는 부분이랑 for문 빠져나오는 부분에서 조금 삽질을 했다
  • 전반적으로 길을 하나씩 탐색해가면서,
    1) 2칸 이상 높아지거나 낮아지는 경우 거르고
    2) 1칸 낮아진 경우는 해당 위치의 오른쪽 부분에 경사로를 놓아야 하기 때문에 오른쪽을 L만큼 탐색하고
    3) 1칸 높아진 경우는 해당 위치의 왼쪽 부분에 경사로를 놓아야 하기 때문에 왼쪽을 L만큼 탐색해야한다
  • 2), 3)의 경우에 오른쪽, 왼쪽을 탐색할 때,
    -> 범위를 벗어나거나, 이미 경사로가 설치돼있거나, 높이가 달라지는 경우를 걸러줘야한다
    -> 위의 경우에서 걸러지지 않고 높이가 같다면 경사로를 설치해준다 (setted[해당위치] = True)
profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글