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

 

14890번: 경사로

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

www.acmicpc.net

 

package Main;
import java.util.Scanner;

public class Main {

	public static int N,L;
	public static int[][] map;
	
	
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
    	
    	N=sc.nextInt();
    	L=sc.nextInt();
    	
    	map = new int[N][N];
    	for(int i=0;i<N;i++) {
    		for(int j=0;j<N;j++) {
    			map[i][j] = sc.nextInt();
    		}
    	}
    	
    	
    	int count = 0;
    	for(int i=0;i<N;i++) {
    		if(calRow(i)) count++;	//i번째 열 확인
    		if(calCol(i)) count++;	//i번째 열 확인
    	}
    	System.out.println(count);
    	

	}
    
    
    //이런 문제의 핵심은 안되는 경우가 잇을경우를 먼저 지워주는 것
    //높이차 1일때 false return
    //또한 계단문제에서 변화가 발생하는것은 계단의 높이가 다음계단과 차이점이 있을때 이벤트가 발생하는것이다.
    public static boolean calRow(int row) {
    	boolean[] isIncline = new boolean[N];	//경사면 설치여부 확인
    	
    	for(int i=0;i<N-1;i++) {	
    		int diff = map[row][i] - map[row][i+1];    		
    		//if(diff == 1) continue;
    		if(diff > 1 || diff < -1) return false;	//높이차 1 초과하므로 false
    		else if(diff == -1) {	//다음계단이 한계단 높은 경우
    			for(int j=0; j<L; j++) {	//올라가는 경사로를 설치할 수 있는지 확인
    				if( i-j < 0 || isIncline[i-j]) return false;
    				if(map[row][i] != map[row][i-j]) return false;
    				isIncline[i-j] = true;
    			}
    		}
    		else if(diff == 1) {	//다음계단이 한계단 낮다
    			for(int j=1;j<=L;j++) {
    				if( i+j >= N || isIncline[i+j]) return false;
    				if(map[row][i] -1!= map[row][i+j]) return false;
    				isIncline[i+j] = true;
    			}
    		}
    	}
    	return true;
    }
    
    public static boolean calCol(int col) {
    	boolean[] isIncline = new boolean[N];	//경사면 설치여부 확인
    	
    	for(int i=0;i<N-1;i++) {
    		int diff = map[i][col] - map[i+1][col];
    		//if(diff == 1) continue;
    		if(diff > 1 || diff < -1) return false;
    		else if(diff == -1) {
    			for(int j=0;j<L;j++) {
    				if( i-j <0 || isIncline[i-j]) return false;
    				if(map[i][col] != map[i-j][col]) return false;
    				isIncline[i-j] = true;
    			}
    		}
    		else if(diff==1) {
    			for(int j=1;j<=L;j++) {
    				if(i+j >=N || isIncline[i+j]) return false;
    				if(map[i][col] -1!= map[i+1][col]) return false;
    				isIncline[i+j]= true;
    			}
    		}
    	}
    	return true;
    }
    
    

}

 

이문제에서 느낀점은 너무 다 생각하지말고 일단 문제에 있는것만 구현하는것입니다.

이런 문제의 핵심은 안되는 경우가 잇을경우를 먼저 지워주는 것
높이차 1일때 false return
또한 계단문제에서 변화가 발생하는것은 계단의 높이가 다음계단과 차이점이 있을때 이벤트가 발생하는것입니다.

+ Recent posts