N*N 크기의 지도가 있다. 길을 건너려고 하는데, 길의 모든 칸 높이가 같아야 한다. 높이 1, 길이 L의 경사로를 놓을 수 있는데 이때 경사로를 놓을 수 있는 조건은
지도가 주어졌을때 지날 수 있는 길의 개수는?
문제 이해를 잘못해서 한참 헤멨다,, ^^
import sys
input = sys.stdin.readline
#경사로 놓을 수 있는지?
def check(b):
# 경사로 놓였으면 1, 아니면 0
slope = [0 for _ in range(N)]
for i in range(N-1):
if abs(b[i]-b[i+1]) > 1:
# 1이상 차이나면 놓을 수 없음
return False
if b[i] == b[i+1]:
continue
# 내리막길 경사로
if b[i] > b[i+1]:
pre = b[i+1]
for j in range(i+1,i+1+L):
if 0 <= j < N:
# 경사로를 설치 할 길이 같은 높이가 아닐 경우
if b[j] != pre:
return False
# 이미 경사로 설치 한 경우
if slope[j] == 1:
return False
# 경사로 설치
slope[j]=1
else:
return False
# 오르막길 경사로
else:
pre = b[i]
for j in range(i,i-L,-1):
if 0 <= j < N:
# 경사로를 설치 할 길이 같은 높이가 아닐 경우
if b[j] != pre:
return False
# 이미 경사로 설치 한 경우
if slope[j] == 1:
return False
# 경사로 설치
slope[j] = 1
else:
return False
return True
N, L = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
result = 0
for b in board:
if check(b):
#경사로 놓을 수 있는지
result+=1
#세로 길 확인하기
for b in list(map(list,zip(*board))):
if check(b):
result+=1
print(result)
python 내장 함수 zip()
num = [1,2,3,4]
alp = ['a','b','c','d']
dic = {}
for n , a in zip(num,alp):
dic[n] = a
print(dic)
# 결과 : {1:'a', 2:'b', 3:'c', 4:'d'}
위의 코드와 마찬가지로 보드의 세로길을 확인할때 zip을 활용할 수 있다 !
for b in list(map(list,zip(*board))):
그리고 다시 알골 열심ㅎ ㅣ풀겠습니다 .. ㅠㅠ