[백준 14890번] 경사로 - Python으로 구현하기

 

문제 접근

  • 경사로를 놓을 수 있는 방법 : 높은 곳 -> 낮은 곳  / 낮은 곳 -> 높은 곳
  • 경사로가 겹치면 안되므로 경사로가 놓여진 부분은 따로 체크해주기
  • 2d에서 행과 열을 모두 확인해봐야 되는 문제이다. 행에 대한 구현만 완료한 뒤 2d 행렬을 트랜스포즈하여 열을 확인하자.
  • Python에서 2D array transpose : t_arr = list(zip(*arr))

 

생각해볼 점

  • [i][j] , [j][i] 의 순서로 이중 반복문 하나로 한번에 처리 가능하다 => 사실 트랜스포즈 과정이 필요없다.

 

 

오답 분석

  • 인덱스 표현에 주의하고 정확하게 하자! 한군데 틀리면 찾기 힘들다.
  • 인덱스를 다루는 문제일 수록 경계값 처리 꼼꼼하게 확인하기

 

def row_solve(arr):
    global cnt
    chk = [[False] * n for _ in range(n)]
    for i in range(n):
        j = 0
        go_flag = True
        while j < n - 1:
            if arr[i][j] == arr[i][j + 1]:
                j += 1
                continue
            elif arr[i][j] - arr[i][j + 1] == 1:  # 높->낮
                if arr[i][j + 1:j+1+L].count(arr[i][j+1]) == L:
                    chk[i][j + 1:j + 1 + L] = [True] * L
                    j = j + L
                    continue
                else:
                    go_flag = False
                    break
            elif arr[i][j] - arr[i][j + 1] == -1:  # 낮->높
                if arr[i][j+1 - L:j+1].count(arr[i][j]) == L and True not in chk[i][j+1 - L:j+1]:
                    chk[i][j+1 - L:j+1] = [True] * L
                    j += 1
                    continue
                else:
                    go_flag = False
                    break
            else:
                go_flag = False
                break

        if go_flag:
            cnt += 1

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

cnt = 0
row_solve(map_data)
row_solve(list(zip(*map_data)))
print(cnt)

 

* 틀린 부분이나 더 나은 방법이 있을 수 있습니다. 지적해주시면 감사하겠습니다!!

+ Recent posts