알고리즘/백준

[백준 - 14890] 골드3 - 경사로

www.acmicpc.net/problem/14890

 

14890번: 경사로

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

www.acmicpc.net

1. 유형

시뮬

 

2. 풀이

완전탐색을 할 때, 몇가지 예외를 생각해야한다.

  • 평평한 경우
  • 오르막길
  • 내리막길

이 3가지 경우를 구현해야 한다

 

이걸 구분하기 위해 plat 변수를 핸들링한다.

 

3. 코드

package 구현.삼성역태;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class back_14890경사로 {
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		int n = Integer.valueOf(st.nextToken());
		int x = Integer.valueOf(st.nextToken());

		int map[][] = new int[n][n];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(in.readLine());
			for (int j = 0; j < n; j++) {
				map[i][j] = Integer.valueOf(st.nextToken());
			}
		}
		int ans = 0;
		for (int j = 0; j < n; j++) {
			int cur;
			int befo;
			int plat = 1;
			boolean check = true;
			out: for (int i = 1; i < n; i++) {
				cur = map[i][j];
				befo = map[i - 1][j];
				if (Math.abs(cur - befo) > 1) {
					check = false;
					break;// 2이상 차이나는 부분
				} else if (cur < befo) {// 내리막길
					for (int k = 0; k < x; k++) {
						if (k + i >= n) {// 범위체크
							check = false;
							break out;
						}
						if (cur != map[i + k][j]) {// 현값하고 앞에 탐색값이 다르면 탈출
							check = false;
							break out;
						}
					}
					i = i + (x - 1);
					plat = 0;
				} else if (cur > befo) {// 오르막길
					if (plat < x) {
						check = false;
						break;
					}
					plat = 1;
				} else {// 평탄한 부분
					plat++;
				}
			}
			if (check) {
				ans++;
			}
		}
		//
		for (int i = 0; i < n; i++) {
			int cur;
			int befo;
			int plat = 1;
			boolean check = true;
			out: for (int j = 1; j < n; j++) {
				cur = map[i][j];
				befo = map[i][j - 1];
				if (Math.abs(cur - befo) > 1) {
					check = false;
					break;// 2이상 차이나는 부분
				} else if (cur < befo) {// 내리막길
					for (int k = 0; k < x; k++) {
						if (k + j >= n) {// 범위체크
							check = false;
							break out;
						}
						if (cur != map[i][j + k]) {// 현값하고 앞에 탐색값이 다르면 탈출
							check = false;
							break out;
						}
					}
					j = j + (x - 1);
					plat = 0;
				} else if (cur > befo) {// 오르막길
					if (plat < x) {
						check = false;
						break;
					}
					plat = 1;
				} else {// 평탄한 부분
					plat++;
				}
			}
			if (check) {
				ans++;
			}
		}
		System.out.println(ans);
	}
}