14890 경사로

cheeeese·2022년 10월 13일
0

코딩테스트 연습

목록 보기
146/151
post-thumbnail

📖 문제

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

💻 내 코드

#14890 경사로
import sys

N, L = map(int,sys.stdin.readline().split())

rlist = [list(map(int,sys.stdin.readline().split())) for _ in range(N)] # 가로
clist = [[0]*N for _ in range(N)] # 세로

# 가로로 탐색하는 경우와 세로로 탐색하는 경우의 로직이 같음
# 하나의 함수로 한번에 활용하기 위해 열과 행을 바꿔 저장한 배열도 생성
for i in range(N):
    for j in range(N):
        clist[j][i]=rlist[i][j]

# 활주로가 가능한지 확인
def isAble(mlist):
    m=1 # L만큼의 길이가 있는지 확인
    i=1
    while i<N:
        if abs(mlist[i]-mlist[i-1])>1: # 높이가 2 이상 차이나면 안됨
            return False
        elif mlist[i-1]==mlist[i]: # 직전과 높이가 같다면
            m+=1 # 칸 개수 count
        elif mlist[i-1]+1==mlist[i]: # 직전보다 높이가 1 높다면
            if m>=L: # 현재보다 1 낮은 칸의 개수가 L이상 이어졌는지 확인
                m=1 # 칸 개수 초기화
            else:
                return False
        elif mlist[i-1]==mlist[i]+1: # 직전보다 높이가 1 낮다면
            m=1 # 현재 칸부터 개수를 셈
            k=mlist[i]
            for j in range(i+1,N):
                if m==L: # L만큼 왔으면 멈춤
                    break
                if mlist[j]==k: # 같은 높이인지 확인
                    m+=1
                    i+=1

                else:
                    break
            if m >= L:
                m = 0
            else:
                return False;
        i+=1

    return True


# 활주로의 개수
def check():
    res = 0
    for i in range(N):
        if isAble(rlist[i]): # 가로
            res+=1
        if isAble(clist[i]): # 세로
            res+=1
    return res

print(check())

💡 풀이

  • 가로와 세로 모두 확인해주어야 하기 때문에 열과 행을 바꿔서도 리스트 생성
  • 한 줄마다 확인하는데 높이가 1씩 차이날 때마다 L만큼의 길이가 있는지 확인해주어야 한다
  • 경사로의 개수가 아니라 가능한 활주로의 개수를 세어주는 것이기 때문에 중간에 안되는 지점이 있으면 바로 False를 반환해줌

0개의 댓글