DevKim

[Python] 삼성 sw 역량 테스트 기출 - 경사로 본문

알고리즘 PS

[Python] 삼성 sw 역량 테스트 기출 - 경사로

on_doing 2021. 3. 16. 20:22
728x90

www.acmicpc.net/problem/14890

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

[ 알고리즘 ]

구현

 

[문제 접근]

이 문제는 세가지의 경우로 나눠야한다

 

1. 경사가 감소하는 경우 (한칸만)

--> 그 전의 경사 높이-1 = 그 다음의 경사 높이 일땐 감소하는 경사의 개수가 L 이상이 되어야함

 

2. 경사가 증가하는 경우 (한칸만)

--> 그 전의 경사 높이+1 = 그 다음 경사 높이 일땐 증가하기 전에 까지의 높이가 연속적으로 L개 이상이 되어야함

 

3. 경사가 같은 경우

--> 단순 check 증가

 

[코드]

N,L=map(int,input().split())
answer=0
board=[]
for i in range(N):
    board.append(list(map(int,input().split())))

def checking(board):
    answer=0

    for i in range(N):
        List = board[i]
        # 모두 같을때
        if len(set(List)) == 1:
            answer += 1
            continue

        # 모두 같지 않음
        else:
            ptr=List[0]
            check=1

            for j in range(1,N):
                if List[j]==ptr: # 같은게 이어졌을 때
                    check+=1
                    ptr=List[j]

                elif List[j]==ptr+1 and check>=0: # 증가하는 애
                    if check>=L:
                        check=1
                        ptr=List[j]
                    else:
                        check=-1
                        break

                elif List[j]==ptr-1 and check>=0: # 감소하는 애
                    check=-L+1
                    ptr=List[j]

                else:
                    check=-1
                    break

            if check>=0:
                answer+=1

    return answer


# 가로, 세로 결과 더하기
print(checking(board)+checking(list(zip(*board))))
728x90
Comments