본문 바로가기

Problem Solving/swea

[SWEA] 4014. 활주로 건설(Python)

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeW7FakkUDFAVH

 

SW Expert Academy

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

swexpertacademy.com

 

어렵지 않은 삼성 모의 SW역량테스트 문제였다.

문제 푸는 데 1시간 정도 소요.

가로(행) 탐색, 세로(열)의 모든 케이스를 check_slope 함수에 넣어 가능하면 1, 불가능하면 0 리턴.
check_slope () 함수에서

  • 같은 높이이면 cnt += 1
  • 높이 1 높아질 때, 그동안의 쌓아온 거리가 경사로 길이보다 크거나 같다면 가능한 경우이므로 cnt = 1로 초기화
  • 높이 1 낮아질 때, 현재 쌓아온 거리가 0보다는 크거나 같다면 현재 쌓아온 거리를 음수 값으로 땡겨주어 경사로 길이만큼 같은 높이를 유지할 때 경사로를 설치할 있도록 함. cnt = -X + 1
  • 높이 2 이상 차이나면 경사로 건설할 수 없는 경우이므로 리턴 0

리턴한 값들을 result에 넣어주며 tc별 result 값 출력

 

파이썬 코드는 다음과 같다.


def check_slope(row):
    cnt = 1
    for i in range(1, N):
        if row[i] == row[i-1]:	# 같은 높이라면
            cnt += 1
        elif row[i] - row[i-1] == 1 and cnt >= X:   # 높이 1 높아지면
            cnt = 1
        elif row[i-1] - row[i] == 1 and cnt >= 0:   # 높이 1 낮아지면
            cnt = -X + 1
        else:   # 높이 2 이상 차이나면
            return 0
    if cnt >= 0:
        return 1
    return 0

# main
T = int(input())
for tc in range(T):
    N, X = map(int, input().split())
    A = []
    result = 0
    for i in range(N):
        A.append(list(map(int, input().split())))
        result += check_slope(A[i])

    for i in range(N):
        temp = []
        for j in range(N):
            temp.append(A[j][i])
        result += check_slope(temp)

    print("#{} {}".format(tc+1, result))

    # 1 7
    # 2 4
    # 3 11
    # 4 11
    # 5 15
    # 6 4
    # 7 4
    # 8 1
    # 9 5
    # 10 8

* 고찰 : 여러 번 풀어본 문제지만 풀 때마다 높이 1 낮아지는 부분은 항상 헷갈린다. 잘 따져주어 코드로 옮기는 것이 중요하다. 오늘도 Keep Going.

 

참고로 이 문제는 백준 사이트의 삼성기출문제집에 있는 14890 - 경사로(www.acmicpc.net/problem/14890) 문제와 완전 같은 문제이다. 풀이도 완전히 동일하다.