[Python][백준] 14890번 경사로

신남·2022년 9월 2일

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

공부 날짜 : 2022.09.02
정답 참조 여부 : X

NxN의 행렬에 높이에 대한 정보가 주어지고 경사로가 주어질때 행 또는 열이 길이 될 수 있는가를 판단하는 문제로 알고리즘 없이 단순히 구현만 하면 되는 문제이기 때문에 어려운 문제는 아니지만 개인적으로 리스트를 다루는부분이 약해서 2번 정도 틀리다가 디버깅을 해보고 답을 찾을 수 있었다.


리스트를 넣었을때 그 리스트가 길이 되는지 bool을 반환하는 함수를 만들고 결과에따라 result를 더해주며 값을 출력해주면 된다.

리스트에서 쉽게 판단하기 위해 높이,길이 형태로 변환해서 새로운 리스트를 만들어 준뒤 i와 i+1만 비교해서 판단했다.
1. 높이가 1이상 차이나면 False
2. 높이차이가 1이라도 길이가 경사로 길이 보다 짧으면 False
3. 경사로를 놓을 수 있으면 길이를 l만큼 제거하여 추가로 경사로를 넣을 수 있는지 추후 판단
4. 위 3가지를 모두 통과하면 True

이런식으로 코드를 작성했다.


데이터를 변환하는 과정에서 오류가 많았는데

    start = rail[0]
    #데이터를 [높이,길이] 형태로 변환해서 담을 변수
    data = []
    length = 1
    #데이터를 [높이,길이] 형태로 변환
    for i in range(1,n):
        if rail[i] == start:
            length += 1
        else:
            data.append([start,length])
            start = rail[i]
            length = 1

이렇게 중간 과정만 생각해서 코드를 작성했고 위 코드대로 데이터를 변환하면 마지막 데이터는 저장되지 않는다.
ex) 333222를 변환하면 [[3,3]]만 저장되고 [2,3]은 저장되지 않는다.
당연히 '틀렸습니다'가 나와도 마지막이 안될거란 생각은 못했기에 코랩에서 디버깅을 해보고 찾을 수 있었다.

리스트를 다루는 부분이 아직 부족하다는 것을 느낄 수 있는 문제였고 특히 시작과 마지막 관련해서 좀 더 생각을 하고 코드를 짜야한다고 생각했다.

소스코드

import sys
input = sys.stdin.readline

n,l = map(int, input().split())

graph = []
for _ in range(n):
    graph.append(list(map(int, input().split())))
    
    
#길이 되는지 아닌지 판단하는 함수
def check_road(rail):
    start = rail[0]
    #데이터를 [높이,길이] 형태로 변환해서 담을 변수
    data = []
    length = 1
    #데이터를 [높이,길이] 형태로 변환
    for i in range(1, n):
        if rail[i] == start:
            length += 1
        else:
            data.append([start,length])
            start = rail[i]
            length = 1
    data.append([rail[-1],length])
    
    #변환된 데이터에 대해서 판단
    for i in range(len(data)-1):
        #높이 차이 1이상 나면 실패 return
        if abs(data[i][0] - data[i+1][0]) > 1:
            return False
        
        #작은쪽에 길이 l만큼 설치 가능한지 판단.
        #가능할경우 l 만큼 빼서 추가 설치 가능한지 판단
        if data[i][0] > data[i+1][0]:
            if data[i+1][1] < l:
                return False
            else:
                data[i+1][1] -= l
        
        else:
            if data[i][1] < l:
                return False
            else:
                data[i][1] -= l
        
    return True

result = 0

#행에 대한 판단
for i in graph:
    if check_road(i[:]):
        result += 1
        
#열에 대한 판단
for i in range(n):
    check_list = []
    for j in range(n):
        check_list.append(graph[j][i])
    if check_road(check_list[:]):
        result += 1
    
    
print(result)    
    

0개의 댓글