[BOJ] 14890 - 경사로

김우경·2021년 3월 29일
0

삼성기출

목록 보기
10/37

문제링크

14890 - 경사로

문제설명

N*N 크기의 지도가 있다. 길을 건너려고 하는데, 길의 모든 칸 높이가 같아야 한다. 높이 1, 길이 L의 경사로를 놓을 수 있는데 이때 경사로를 놓을 수 있는 조건은

  • L개의 연속된 모든 같은 높이 낮은 칸에
  • 낮은 칸과 높은 칸의 높이 차이는 1
  • 경사로를 이미 놓은 칸에는 놓을 수 없음

지도가 주어졌을때 지날 수 있는 길의 개수는?

코드

문제 이해를 잘못해서 한참 헤멨다,, ^^

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()

  • 여러개의 iterable element를 매핑하여 하나의 tuple로
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))):

그리고 다시 알골 열심ㅎ ㅣ풀겠습니다 .. ㅠㅠ

profile
Hongik CE

0개의 댓글