Algorithm/Baekjoon Online Judge

[Java] BOJ14890_경사로

'지훈' 2021. 4. 19. 23:45

www.acmicpc.net/problem/14890

 

14890번: 경사로

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

www.acmicpc.net


행과 열을 구분하여 경사로를 놓아 지나갈 수 있는 길의 수를 셌다.

 

반복문을 진행하면서 평평한 부분의 길이를 세어주고 높이가 1 차이나는 오르막이 나올 경우 평평했던 부분이 놓을 수 있는 경사로보다 길다면 지나갈 수 있다고 판단해준다.

높이가 1 차이나는 내리막이 나올 경우 내리막이 나온 지점부터 평평한 부분의 길이를 세어주어 경사로를 놓을 수 있는지 판단한다.

 

import java.io.*;
import java.util.StringTokenizer;

public class Main {

	static int N,X,map[][];
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		X = Integer.parseInt(st.nextToken());
		map = new int[N][N];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
			
		System.out.println(process());
		
	}

	private static int process() {
		int count = 0;
		for (int i = 0; i < N; i++) {
			if(makeRoadByRow(i)) count++;
			if(makeRoadByCol(i)) count++;
		}
		return count;
	}
	private static boolean makeRoadByRow(int i) {
		int beforeHeight = map[i][0], size= 0;
		int j = 0;
		while(j < N) {
			if(beforeHeight==map[i][j]) {
				++size;
				++j;
			} else if(beforeHeight+1 == map[i][j]) { //오르막
				if(size < X) return false;
				beforeHeight++;
				size = 1;
				++j;
			} else if(beforeHeight-1 == map[i][j]) { //내리막
				int count = 0;
				for (int k = j; k < N; k++) {
					if(map[i][k] != beforeHeight-1) break;
					if(++count==X) break;
				}
				if(count < X) return false;
				beforeHeight--;
				size = 0;
				j += X;
			} else {
				return false;
			}
		}
		return true;
	}

	private static boolean makeRoadByCol(int i) {
		int beforeHeight = map[0][i], size= 0;
		int j = 0;
		while(j < N) {
			if(beforeHeight==map[j][i]) {
				++size;
				++j;
			} else if(beforeHeight+1 == map[j][i]) { //오르막
				if(size < X) return false;
				beforeHeight++;
				size = 1;
				++j;
			} else if(beforeHeight-1 == map[j][i]) { //내리막
				int count = 0;
				for (int k = j; k < N; k++) {
					if(map[k][i] != beforeHeight-1) break;
					if(++count==X) break;
				}
				if(count < X) return false;
				beforeHeight--;
				size = 0;
				j += X;
			} else {
				return false;
			}
		}
		return true;
	}


}