Algorithm/백준

[백준][14890번] 경사로

1일1코딩 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);
}

결과