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)