[알고리즘 : 구현 ] 14890 경사로

JIN·2022년 7월 8일
0

경사로



조건 구현 문제.
가로 한 줄 , 세로 한 줄씩을 묶음으로 보아 각 줄이 조건을 모두 통과하면 결과 갯수를 update한다.
함수로 빼야할 조건 :
1. 반복문을 돌면서 옆에 있는 블록과 1이상 차이나면 return False
2. 이전 블록이 현재 블록보다 큰 경우 :내려가는 사선 / 현재 블록이 이전 블록보다 큰 경우 :올라가는 사선
3.실패할 조건

      1. 경사로를 더한 길이가 블록을 넘을 경우 
      2. 경사로를 더한 곳을 방문한 적 있는 경우
      3. 높은 블록과 경사로를 더한 낮은 블록의 높이가 같지 않은 경우 
      그렇지 않다면? 경사로를 두고 방문처리 해준다 
  1. 통과할 조건
    3번의 조건이 모두 통과했다면 통과
import sys
input = sys.stdin.readline
number, length = map(int, input().split())
group = []
for _ in range(number):
	group.append(list(map(int, input().split())))


def check(now):
	for i in range(1, number):
		if abs(now[i] - now[i-1]) > 1:
			return False
		if now[i] > now[i-1]:
			for k in range(length):
				if i-k-1 < 0 or now[i-k-1] != now[i-1] or visited[i-k-1]:
					return False
				if now[i-k-1] == now[i-1]:
					visited[i-k-1] = True

		elif now[i] < now[i-1]:
			for k in range(length):
				if i+k >= number or now[i+k] != now[i] or visited[i+k]:
					return False
				if now[i+k] == now[i]:
					visited[i+k] = True

	return True

result = 0
# 가로로 봤을 때 몇개나 통과?
for i in range(number):
	visited = [False for _ in range(number)]
	if check(group[i]):
		result += 1

for i in range(number):
	# 리스트 처리 해주기 
	visited = [False for _ in range(number)]
	if check([group[j][i] for j in range(number)]):
		result += 1
print(result)
profile
배우고 적용하고 개선하기

0개의 댓글