보물창고 블로그

SW Expert Academy 4014. [모의 SW 역량테스트] 활주로 건설 본문

알고리즘 풀이/SW Expert Academy

SW Expert Academy 4014. [모의 SW 역량테스트] 활주로 건설

홋 메 2020. 1. 17. 13:42
728x90

문제 링크:https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeW7FakkUDFAVH

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

이 문제의 핵심은 리스트 한 줄을 활주로 건설이 가능한지 아닌지를 판단하는 문제이다. 내가 생각한 핵심 구현 내용은 활주로 건설 여부이다. 먼저 리스트 1줄을 받았을 때, 이 리스트에서 활주로 건설이 가능한지 아닌지를 판별하는 함수를 구현하기로 하였다. 나는 이 함수를 check라는 이름의 함수로 구현하였다. 먼저 1칸씩 전진하면서 한 칸 앞의 높이값과 비교하여서 차이가 1 이상이면 경사로를 설치할 수 없으므로 False를 반환하게 하였고, 만약 높이값이 같다면 통과하고 만약 차이가 1이라면 앞칸이 높은지 뒷칸이 높은 지를 판별하여서 경사로 길이만큼 탐색하여서 설치할 수 있으면 넘어가고 만약 설치할 수 없거나 경사로가 설치되어있다면 False를 반환하게 하였다.  이후 절벽 지대를 행별로, 열 별로 탐색해야 하므로 열을 탐색할 때는 절벽 지대를 90도 회전하여서 map2라는 리스트에 넣어서 탐색하였다. 아래는 나의 풀이 코드이다.

def check(list1, x):
    n = len(list1)
    construct = [0 for _ in range(n)]
    result = True
    for i in range(n-1):
        a1 = list1[i]
        a2 = list1[i+1]
        if abs(a1-a2) > 1:
            result = False
            break
        elif a1 == a2:
            continue
        else:
            if a1 > a2:
                flag1 = 0
                if i+1+x > n:
                    result = False
                    break
                else:
                    for j in range(i+1, i+1+x):
                        if list1[j] != a2 or construct[j] == 1:
                            flag1 = 1
                            break
                    if flag1 == 1:
                        result = False
                        break
                    else:
                        for j in range(i+1,i+1+x):
                            construct[j]=1

            elif a2 > a1:
                flag2 = 0
                if i-x < -1:
                    result = False
                    break
                else:
                    for j in range(i, i-x, -1):
                        if list1[j] != a1 or construct[j]==1:
                            flag2 = 1
                            break
                    if flag2==1:
                        result=False
                        break
                    else:
                        for j in range(i,i-x,-1):
                            construct[j]=1


    return result

t = int(input())
for test in range(1, t+1):
    n, x = map(int, input().split())
    count=0
    map1 = []
    for _ in range(n):
        map1.append(list(map(int, input().split())))
    map2=[]
    for i in range(n):
        list2=[]
        for j in range(n-1,-1,-1):
            list2.append(map1[j][i])
        map2.append(list2)
    for i in range(n):
        if check(map1[i],x)==True:
            count+=1
        if check(map2[i],x)==True:
            count+=1
    
    print('#{} {}'.format(test,count))
Comments