Algorithm/Implementation

[백준 14890번] 경사로

킹우현 2023. 8. 17. 04:44

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

 

n, l = map(int,input().split())

area = [list(map(int,input().split())) for _ in range(n)]


total = 0

def checkLine(line):
    inclined = [False for _ in range(n)]
    
    for i in range(n-1):
        if line[i] == line[i+1]: # 높이가 같은 경우에는 Pass
            continue
        
        if abs(line[i]-line[i+1]) >= 2: # 낮은 칸과 높은 칸의 높이 차이가 1이 아닌 경우(조건 2)
            return False
        
        if line[i] > line[i+1]: # 내리막길인 경우
            target = line[i+1] # 낮은 지점의 칸 높이
            for j in range(1,l+1): # 경사로 길이만큼 확인
                if 0 <= i+j < n:
                    if line[i+j] != target: # 낮은 지점의 칸의 높이가 모두 같지 않거나, L개가 연속되지 않은 경우(조건 3)
                        return False
                    if inclined[i+j]: # 경사로를 놓은 곳에 또 경사로를 놓는 경우(조건 1)
                        return False
                    inclined[i+j] = True
                else: # 경사로를 놓다가 범위를 벗어나는 경우(조건 4)
                    return False

        else: # 오르막길인 경우
            target_2 = line[i] # 높은 지점의 칸 높이
            for j in range(l): # 경사로의 길이만큼 확인
                if 0 <= i-j < n:
                    if line[i-j] != target_2: # 낮은 지점의 칸의 높이가 모두 같지 않거나, L개가 연속되지 않은 경우(조건 3)
                        return False
                    if inclined[i-j]: # 경사로를 놓은 곳에 또 경사로를 놓는 경우(조건 1)
                        return False
                    inclined[i-j] = True
                else: # 경사로를 놓다가 범위를 벗어나는 경우(조건 4)
                    return False
            
    return True

for i in area:
    if checkLine(i):
        total += 1

for i in range(n):
    temp_area = []
    for j in range(n):
        temp_area.append(area[j][i])
    if checkLine(temp_area):
        total += 1

print(total)

이번 문제는 해당 행이나 열이 주어진 조건에 맞게 경사로를 만들어서 지나갈 수 있는 길인지 아닌지를 구별하는 문제이다.

 

이러한 문제를 풀 때의 핵심은 주어진 조건을 하나씩 확인해가며 차근차근 풀이하는 것이다.

 

처음에 이 문제를 접근했을 때는 주어진 조건들을 순서없이 중구난방으로 체크하기도 했고, 행을 확인하는 함수와 열을 확인하는 함수를 따로 구분하여 구현을 하였는데 이렇게 풀이를 하다보니 자꾸 내가 원하는 정답이 나오지 않거나 코드를 수정하는 것이 너무 힘들었다.

 

다른 사람의 풀이를 참고하면서 내 코드를 되돌아보니 비효율적인 방법으로 함수를 구현하기도 했고, if와 else를 순차적으로 확인하지 않아서 테스트케이스가 자꾸 맞지 않는다는 것을 파악했다.

 

배운 점 및 느낀 점

  1. 함수를 만들 때는 중복된 코드를 작성하지 않도록 추상화하자.
  2. 구현문제를 풀 때는 주어진 명세에 맞게 코드를 작성하도록 하자.
  3. 위와 같이 코드를 작성하기 위해서는 시간이 조금 걸리더라도 문제의 요구사항을 완벽하게 이해해야한다.
  4. 조건문과 분기처리는 최대한 명확하게 하도록 하자.