반응형
문제 출처 :
https://www.acmicpc.net/problem/14890
알고리즘 분석 :
문제 해결에 필요한 사항
1. 구현
solve1은 가로를 체크하는 함수이고 solve2는 세로를 체크하는 함수이다.
for문을 돌며 현재값과 이전값이 같으면 val++를 해주고
만약 old < cur일때 즉, 오르막길이라면 내가 val를 계산해온 값이 m개 이상이거나 1계단 차이일때만 계속해서 진행해주는 방식을 취해준다.
그리고 cur < old 즉, 내리막길이면 내가 val를 계산해온 값이 0 이상이어야 한다.
이 의미는 이전에 내가 만약 내리막길을 설치한 적이 있었다면 1 - m에 의해 음수가 되있을 텐데 이때 길의 개수가 충족되지 않은 상태에서 다시 내리막길을 만난다는 의미가 되기 때문이다.
마지막으로 val >= 0인지 체크하여 정답을 +1해줄지 결정한다.
소스 코드 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int arr[102][102]; int ans; int n, m; bool solve1(int tmp) { int cur, old; int val = 0; old = arr[0][tmp]; val = 1; for (int i = 1; i < n; i++) { cur = arr[i][tmp]; if (cur == old) val++; else if (old < cur) { if (val < m || (cur - old) > 1) return 0; val = 1; } else { if (val < 0 || (old - cur) > 1) return 0; val = 1 - m; } old = cur; } return (val >= 0); } bool solve2(int tmp) { int cur, old; int val = 0; old = arr[tmp][0]; val = 1; for (int i = 1; i < n; i++) { cur = arr[tmp][i]; if (cur == old) val++; else if (old < cur) { if (val < m || (cur - old) > 1) return 0; val = 1; } else { if (val < 0 || (old - cur) > 1) return 0; val = 1 - m; } old = cur; } return (val >= 0); } int main() { scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) scanf("%d", &arr[i][j]); for (int i = 0; i < n; i++) ans += (solve1(i) + solve2(i)); printf("%d", ans); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[16235번] 나무 재테크 (0) | 2018.10.22 |
---|---|
[16236번] 아기 상어 (4) | 2018.10.21 |
[1038번] 감소하는 수 (0) | 2018.09.25 |
[16159번] 전광판의 숫자 (0) | 2018.09.22 |
[15965번] K번째 소수 (0) | 2018.09.21 |