-
[백준][14890번] 경사로Algorithm/백준 2020. 4. 25. 16:58
https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
풀이과정
1. 가로, 세로 방향을 체크해주었다.
2. 이전값과 현재값이 달라지는 구간에서 경사로가 필요하다.
3. 값이 달라지는 경우!!
prev < cur의 경우 prev와 같은 값을 가지는 갯수를 체크해 지나왔기 때문에 그걸 이용해 경사로 길이보다 크다면 OK
prev > cur 경우 cur에서 L길이의 경사로를 놓을 수 있는지 체크해준다.
소스코드
더보기#include <stdio.h> enum DIR {ROW, COL}; int map[100][100]; int N, L; int answer; int abs(int n) { return n >= 0 ? n : n * -1; }; int checkLine(int start, int dir) { if (dir == DIR::ROW) { int prev = map[start][0]; int prevLen = 1; for (int i = 1; i < N; i++) { int cur = map[start][i]; if (prev != cur) { if (abs(prev - cur) != 1) { return 0; } if (cur < prev) { for (int j = 1; j < L; j++) { if (map[start][i + j] != cur) { return 0; } } i = i + L - 1; prevLen = 0; prev = cur; continue; } else { if (prevLen < L) { return 0; } } prev = cur; prevLen = 1; } else { prevLen++; } } return 1; } else { int prev = map[0][start]; int prevLen = 1; for (int i = 1; i < N; i++) { int cur = map[i][start]; if (prev != cur) { if (abs(prev - cur) != 1) { return 0; } if (cur < prev) { for (int j = 1; j < L; j++) { if (map[i + j][start] != cur) { return 0; } } i = i + L - 1; prevLen = 0; prev = cur; continue; } else { if (prevLen < L) { return 0; } } prev = cur; prevLen = 1; } else { prevLen++; } } return 1; } } void solution() { for (int i = 0; i < N; i++) { if (checkLine(i, DIR::ROW)) { answer++; } if (checkLine(i, DIR::COL)) { answer++; } } } int main() { scanf("%d %d" ,&N, &L); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d", &map[i][j]); } } solution(); printf("%d\n", answer); }
결과
'Algorithm > 백준' 카테고리의 다른 글
[백준][15683번] 감시 (0) 2020.04.26 [백준][14891번] 톱니바퀴 (0) 2020.04.26 [백준][14889번] 스타트와 링크 (0) 2020.04.23 [백준][14503번] 로봇 청소기 (0) 2020.04.23 [백준][14888번] 연산자 끼워넣기 (0) 2020.04.23