본문으로 바로가기

[BaekJoon] 백준 14890 경사로

category 알고리즘/백준 2020. 5. 30. 21:41

문제가 너무 길어서 코드만 올립니다. 

 

저는 이전 경사로를 복구시키기가 귀찮아서 그냥 배열 2개를 선언했습니다.

 

한개는 행 전용 배열이고 한개는 열 전용 배열입니다. 

 

import java.util.Scanner;

public class Main {	
	public static void main(String args[]) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int l = scan.nextInt();
		int[][] arr = new int[n][n];
		int[][] arr2 = new int[n][n];
		int count = 0;
		
		
		for(int i = 0; i<n; i++) {
			for(int  j = 0; j<n; j++) {
				arr[i][j] = scan.nextInt();
				arr2[j][i] = arr[i][j];
			}
		}
		//column
		int curr = 0;
		for(int i = 0; i<n ;i++) {
			curr = arr[i][0];
			for(int j = 1; j<n; j++) {
					if(curr == arr[i][j]) {
						if(j == n-1) {
							count++;
						}
						continue;
					}
					
					else {
						int flag = 0;
											
						//높은곳 -> 낮은곳
						if( curr > arr[i][j]) {
							flag = 0;
							if(j+l > n) {
								break;
							}
							for(int k = 0; k<l; k++) {
								if( !(curr-1 == arr[i][j+k]) ) {
									flag = 1; break;
								}
							}
							if(flag == 1) break;
							else {
								curr = arr[i][j+l-1];
								arr[i][j+l-1] = 20; 
								j = j+l-1; 
								if(j == n-1) {
									count++; break;
								}
								
								
								
							}
							continue;
						}
						//낮은곳 -> 높은곳
						else if(curr < arr[i][j]) {
							flag = 0;
							if(curr+1 < arr[i][j]) break;
							if(j-l < 0) {
								break;
							}
							for(int k = 1; k<=l; k++) {
								if( !(curr == arr[i][j-k])) {
								flag = 1;break;
								}
							}
							
							if(flag == 1) 
								break;
							else {
								curr = arr[i][j];
								if(j == n-1) count++;
							}
						}
					}
			}
		}
		//row
		curr = 0;
		for(int i = 0; i<n ;i++) {
			curr = arr2[i][0];
			for(int j = 1; j<n; j++) {
					if(curr == arr2[i][j]) {
						if(j == n-1) {
							count++;
						}
						continue;
					}
					
					else {
						int flag = 0;
											
						//높은곳 -> 낮은곳
						if( curr > arr2[i][j]) {
							flag = 0;
							if(j+l > n) {
								break;
							}
							for(int k = 0; k<l; k++) {
								if( !(curr-1 == arr2[i][j+k]) ) {
									flag = 1; break;
								}
							}
							if(flag == 1) break;
							else {
								curr = arr2[i][j+l-1];
								arr2[i][j+l-1] = 20; 
								j = j+l-1; 
								
								if(j == n-1) {
									count++; break;
								}
								
								
								
							}
							continue;
						}
						//낮은곳 -> 높은곳
						else if(curr < arr2[i][j]) {
							flag = 0;
							if(curr+1 < arr2[i][j]) break;
							if(j-l < 0) {
								break;
							}
							for(int k = 1; k<=l; k++) {
								if( !(curr == arr2[i][j-k])) {
								flag = 1;break;
								}
							}
							
							if(flag == 1) 
								break;
							else {
								curr = arr2[i][j];
								if(j == n-1) count++;
							}
						}
					}
			}
		}
		System.out.println(count);
	}
	
}