문제
크기가 N×N인 지도가 있다. 지도의 각 칸에는 그 곳의 높이가 적혀져 있다.
오늘은 이 지도에서 지나갈 수 있는 길이 몇 개 있는지 알아보려고 한다. 길이란 한 행 또는 한 열 전부를 나타내며, 한쪽 끝에서 다른쪽 끝까지 지나가는 것이다.
길을 지나갈 수 있으려면 길에 속한 모든 칸의 높이가 모두 같아야 한다. 또는, 경사로를 놓아서 지나갈 수 있는 길을 만들 수 있다. 경사로는 높이가 항상 1이며, 길이는 L이다. 또, 개수는 매우 많아 부족할 일이 없다. 경사로는 낮은 칸과 높은 칸을 연결하며, 아래와 같은 조건을 만족해야한다.
- 경사로는 낮은 칸에 놓으며, L개의 연속된 칸에 경사로의 바닥이 모두 접해야 한다.
- 낮은 칸과 높은 칸의 높이 차이는 1이어야 한다.
- 경사로를 놓을 낮은 칸의 높이는 모두 같아야 하고, L개의 칸이 연속되어 있어야 한다.
아래와 같은 경우에는 경사로를 놓을 수 없다.
- 경사로를 놓은 곳에 또 경사로를 놓는 경우
- 낮은 칸과 높은 칸의 높이 차이가 1이 아닌 경우
- 낮은 지점의 칸의 높이가 모두 같지 않거나, L개가 연속되지 않은 경우
- 경사로를 놓다가 범위를 벗어나는 경우
지도가 주어졌을 때, 지나갈 수 있는 길의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
출력
첫째 줄에 지나갈 수 있는 길의 개수를 출력한다.
내 풀이
행 / 열 각각에 대해 갈 수 있는 길인지 ispossible 함수를 통해 검사한다.
인접한 블록의 높이를 확인하여 높이 차이가 난다면 경사로를 놓을 수 있는지 검사한다.
높이 차이가 날 때 경사로를 놓을 수 있다면 check list에 경사로를 놓은 것을 표시하여 중복으로 경사로를 놓지 않도록 한다.
ispossible에서 True가 return 되면 result에 더해 출력한다.
자세한 풀이 과정은 아래 코드에!
'알고리즘' 카테고리의 다른 글
BOJ 14891 톱니바퀴 (0) | 2019.09.18 |
---|---|
BOJ 14889 스타트와 링크 (0) | 2019.09.18 |
파이썬으로 순열 구현하기 (0) | 2019.09.14 |
BOJ 14888 연산자 끼워넣기 (0) | 2019.09.14 |
BOJ 14503 로봇청소기 (0) | 2019.09.14 |