[Python] SW Expert Academy #4014 활주로 건설

이재원·2024년 4월 15일

Samsung SW Expert Academy

목록 보기
22/34

📚문제: 활주로 건설(모의 SW 역량테스트)

전체 코드

# 4014. 활주로 건설

# 활주로 건설 가능한 경우의 수를 파악하는 함수
def build(G, t):
    
    # 경우의 수
    cnt = 0
    
    # 가로
    for i in range(N):
        
        road = G[i]
        
        temp = [0] * N
        temp[0] = 1
        
        tf = True
        
        for i in range(N-1):
            
            cur = road[i]
            nxt = road[i+1]
            
            # 이웃한 것이 같을 때
            if cur == nxt:
                
                temp[i+1] = temp[i] + 1
            
            # 오른쪽 계단이 더 높을 때
            elif cur < nxt:
                
                if cur + 1 < nxt:
                    
                    tf = False
                    break
                
                # 오르막 경사로를 만들 수 있음
                if temp[i] >= X:
                    
                    temp[i+1] = 1
                
                else:
                    
                    tf = False
                    break
                
            # 오른쪽 계단이 더 낮을 때
            elif cur > nxt:
                
                if cur -1 > nxt:
                    
                    tf = False
                    break
                
                # 내리막 경사로 만들 수 없음
                if temp[i] < 0:
                    
                    tf = False
                    break
                
                # 내리막 경사로 만들 수 있음
                else:
                    
                    temp[i+1] = 1-X
                    
        if tf:
            
            if temp[-1] >= 0:
                
                cnt += 1
    
    # 90도 시계방향 회전
    G_90 = [[0] * N for _ in range(N)]
    
    for i in range(N):
        
        for j in range(N):
            
            G_90[j][N-1-i] = G[i][j]
            
    # 세로
    for i in range(N):
        
        road = G_90[i]

        temp = [0] * N
        temp[0] = 1
        
        tf = True
        
        for i in range(N-1):
            
            cur = road[i]
            nxt = road[i+1]
            
            # 이웃한 것이 같을 때
            if cur == nxt:
                
                temp[i+1] = temp[i] + 1
            
            # 오른쪽 계단이 더 높을 때
            elif cur < nxt:
                
                if cur + 1 < nxt:
                    
                    tf = False
                    break
                
                # 오르막 경사로를 만들 수 있음
                if temp[i] >= X:
                    
                    temp[i+1] = 1
                
                else:
                    
                    tf = False
                    break
                
            # 오른쪽 계단이 더 낮을 때
            elif cur > nxt:
                
                if cur -1 > nxt:
                    
                    tf = False
                    break
                
                # 내리막 경사로 만들 수 없음
                if temp[i] < 0:
                    
                    tf = False
                    break
                
                # 내리막 경사로 만들 수 있음
                else:
                    
                    temp[i+1] = 1-X
                    
        if tf:
            
            if temp[-1] >= 0:
                
                cnt += 1
    
    # 답안 출력
    print("#{} {}".format(t, cnt))
        
# 총 테스트 케이스의 개수 T
T = int(input())

# T개의 테스트 케이스
for t in range(1, T+1):
    
    # N, X가 주어진다.
    N, X = map(int, input().split())
    
    # 지형
    tr = []
    
    # N × N 크기의 지형 정보가 주어진다.
    for _ in range(N):
        
        tr.append(list(map(int, input().split())))
    
    # 함수 실행
    build(tr, t)

0개의 댓글