슈뢰딩거의 고등어

14890 경사로 본문

알고리즘

14890 경사로

슈뢰딩거의 고등어 2021. 12. 4. 10:15

https://www.acmicpc.net/problem/14890

골드 3

 

14890번: 경사로

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

www.acmicpc.net

 

90 도 돌려서 밑에다가 붙여넣으면 세로, 가로 비교 필요 없이 한번에 가로만 확인하면 된다.

 

 

내리막을 만나면, 이전 유효거리가 0 보다 크면(경사로 설치가 가능하다는 의미) 유효거리를 1-L로 변경. 평지이면 +1

오르막을 만났는데 유효길이가 L 보다 작을 경우, 경사로의 끝이 걸리므로 경사로 설치 불가.

 

오르막에서 경사로를 만드는 것이 가능하면 유효길이를 1로 초기화

 

만약에 0 이하일 경우, 경사로 끝이 걸리는 것이기 때문에 경사로 설치 불가

#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <vector>
#include <algorithm>
using namespace std;

int N, L;
int arr[200][110];



int main(int argc, char ** argv) {

	int answer = 0;

	scanf("%d %d", &N, &L);

	for(int i=0; i<N; i++)
		for(int j=0; j<N; j++)
			scanf("%d", &arr[i][j]);


	// 90 도 돌려 밑에다가 가져다 붙이기
	for(int i=0; i<N; i++)
		for(int j=0; j<N; j++)
			arr[N+i][j] = arr[j][i];


	// horiziontal
	for(int i=0; i< 2*N ; i++) {
		bool success = true;
		int count = 1 ;
		for(int j=0; j<N-1; j++)
			if(arr[i][j] == arr[i][j+1]) {
				count++;
			}

			// 오르막 && 경사로를 놓을 수 있으면
			else if(arr[i][j]+1 == arr[i][j+1] && count >= L) {
				count = 1;
			}
			// 내리막 && 
			else if(arr[i][j]-1 == arr[i][j+1] && count >= 0)
				count = 1-L;

			else {
				success = false;
				break;
			}

		if(success == true && count >= 0)
			answer++;
			
	}


	printf("%d\n", answer);

	return 0;

}

 

'알고리즘' 카테고리의 다른 글

level 2 소수찾기 -순열 (algorithm :: next_permutaion)  (0) 2021.12.06
19236 청소년상어 (cstring :: memcpy)  (0) 2021.12.06
16236 아기상어  (0) 2021.12.05
15656 치킨배달  (0) 2021.12.05
14501 퇴사  (0) 2021.12.02
Comments