본문 바로가기

백준 문제풀이(JAVA)

백준 14890번(JAVA)

반응형
import java.util.*;
import java.io.*;

public class Main {
    public static int N;
    public static int L;
    public static int[][] map;
    public static int result = 0;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s = br.readLine().split(" ");
        N = Integer.parseInt(s[0]);
        L = Integer.parseInt(s[1]);
        map = new int[N][N];
        for(int i = 0; i < N; i++){
            s = br.readLine().split(" ");
            for(int j = 0; j < N; j++){
                map[i][j] = Integer.parseInt(s[j]);
            }
        }

        for(int i = 0; i < N; i++){
            row_check(i);
            column_check(i);
        }
        System.out.println(result);
    }

    public static void row_check(int idx){
        boolean[] incline = new boolean[N];
        for(int i = 0; i < N - 1; i++){
            int diff = map[idx][i] - map[idx][i + 1];
            if(Math.abs(diff) >= 2){
                return;
            }// 높이 차이가 2 이상이라면
            if(diff == 1){
                if(i + L > N - 1){
                    return;
                }// 충분한 칸 이 없다
                for(int j = i + 1; j <= i + L; j++){
                    if(map[idx][j] != map[idx][i] - 1){
                       return;
                    }//내려가는 경사로를 설치할 때 도중에 높이가 바뀌어서는 안된다
                    incline[j] = true;
                }
            }// 내려가는 경사로 설치

            if(diff == -1){
                if(i - L + 1 < 0){
                    return;
                }// 충분한 칸이 없다
                for(int j = i; j >= i - L + 1; j--){
                    if(map[idx][j] != map[idx][i + 1] - 1){
                        return;
                    }
                    if(incline[j]){
                        return;
                    }//방문된적이 있다면 경사로 설치가 불가능
                }
            }//올라가는 경사로 설치
        }
        result++;
    }
    //
    public static void column_check(int idx){
        boolean[] incline = new boolean[N];
        for(int i = 0; i < N - 1; i++){
            int diff = map[i][idx] - map[i + 1][idx];
            if(Math.abs(diff) >= 2){
                return;
            }// 높이 차이가 2 이상이라면
            if(diff == 1){
                if(i + L > N - 1){
                    return;
                }// 충분한 칸 이 없다
                for(int j = i + 1; j <= i + L; j++){
                    if(map[j][idx] != map[i][idx] - 1){
                        return;
                    }//내려가는 경사로를 설치할 때 도중에 높이가 바뀌어서는 안된다
                    incline[j] = true;
                }
            }// 내려가는 경사로 설치

            if(diff == -1){
                if(i - L + 1 < 0){
                    return;
                }// 충분한 칸이 없다
                for(int j = i; j >= i - L + 1; j--){
                    if(map[j][idx] != map[i + 1][idx] - 1){
                        return;
                    }
                    if(incline[j]){
                        return;
                    }//방문된적이 있다면 경사로 설치가 불가능
                }
            }//올라가는 경사로 설치
        }
        result++;
    }
}

 

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

 

 

요즘 코딩 테스트 트렌드에 맞게 구현 위주의 문제로 다시 연습 중

 

반응형