알고리즘 공부/백준 문제풀이

[python 백준] 14890번 경사로

이현찬 2022. 8. 7. 20:14
728x90

문제 링크

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

문제 설명

  • 2 차원 배열로 높이가 주어지는 지도에서 높이 차이가 1이고 길이가 L인 경사로를 놓아 지나갈 수 있는 경로의 수를 구하는 문제
  • 배열의 크기가 $N \times N$일 때, 행 방향의 N개의 경로가 있고, 열 방향의 N개의 경로가 있어 행 방향과 열 방향 두번 탐색을 해주어야함

고민한 부분

  • 경사로를 놓아야 하는 경우는 높이가 낮아지는 경우와 높아지는 경우로 나누어 생각할 수 있고 경사로의 높이는 1로 고정되어 있기 때문에 만약 높이 차이가 1보다 크다면 경로 확인을 멈추면 됨
  • 처음에는 램프가 놓인 부분을 표시하는 배열 없이 풀이를 했지만 램프가 겹치는 경우를 제외할 방법을 찾지 못해 check_row 함수에 RAMP 리스트를 만들어 경사로가 놓인 부분을 표시해 풀이를 했다.
  • 행과 열을 입력으로 넣어줄 때 하나의 함수를 사용하기 위해 열 방향의 경로를 입력해 줄 때, line 64의 코드처럼 작성했다.

Lesson learned

  • 2 차원 배열의 행과 열을 모두 탐색하는 문제를 가장 작은 단위로 나누어보면 하나의 행이나 열을 탐색하는 문제를 풀면 전체 문제를 풀 수 있게 된다. 코드를 작성하기 전에 문제를 작은 단위로 나누어 구현할 기능을 명확하게 한 후 코드를 작성하면 디버깅을 할 때도 전체 코드를 한번에 검사하는 것이 아니라 작은 코드를 검사하면 되기 때문에 편리할 것 같다.
  • 이 문제를 해결하며 시간이나 메모리의 제한을 먼저 고민하기보다 우선 기능을 구현한 후에 시간, 메모리 제한 조건을 맞춰가는 것이 나은 전략일 것 같다는 생각을 했다.