코딩문제풀이/Baekjoon

[Java] 백준 14890번 : 경사로

코딩하는 포메라니안 2023. 1. 3. 17:38

1. 문제

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

 

14890번: 경사로

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

www.acmicpc.net

 

 

2. 풀이 과정

가로, 세로 따로 보고 겹치는지 확인해주면 된다. 즉 각 길간에는 경사로가 겹치는지는 확인할 필요 없다.

 

경사로로 갈 수 있는지는 1칸 오르막 길과 1칸 내리막 길 2가지 경우로 나눠서 생각해줬다.

'오르막길'의 경우, 길 하나를 탐색하면서 현재 보고 있는 값과 같은 값이 몇 개 연속으로 나왔는지 저장하고 있다가 오르막길을 만났을 때 그 개수가 L개 이상이면 pass, 아니면 return false로 탐색을 중지하도록 했다.

'내리막길'의 경우, L개 만큼 반복문을 돌면서 해당 칸이 L개 있는지 확인해주었다.

 

높이차이가 2이상인 경우는 바로 return false를 해주었다.

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

public class Main {
    static int N, L;
    static int[][] arr;
    static int result;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        L = Integer.parseInt(st.nextToken());
        arr = new int[N][N];
        result = 0;

        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < N; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for(int i = 0; i < N; i++) {
            if(row(i)){
                result++;
            }
            if(column(i)) {
                result++;
            }
        }
        
        System.out.println(result);
    }



    public static boolean column(int y) {
        int count = 1;
        int now = arr[0][y];
        for(int i = 1; i < N; i++) {
            if(now == arr[i][y]) {
                count++;
                continue;
            }
            else if(now + 1 == arr[i][y]) {
                if(count < L) {
                    return false;
                } else {
                    count = 1;
                    now = arr[i][y];
                }
            }
            else if(now - 1 == arr[i][y]) {
                for(int j = 0; j < L; j++) {
                    if(i + j >= N || arr[i + j][y] != arr[i][y]) {
                        return false;
                    }
                }
                i += L - 1;
                count = 0;
                now = arr[i][y];
            }
            else {
                return false;
            }
        }
        return true;
    }


    public static boolean row(int x) {
        int count = 1;
        int now = arr[x][0];
        for(int i = 1; i < N; i++) {
            if(now == arr[x][i]) {
                count++;
                continue;
            }
            else if(now + 1 == arr[x][i]) {
                if(count < L) {
                    return false;
                } else {
                    count = 1;
                    now = arr[x][i];
                }
            }
            else if(now - 1 == arr[x][i]) {
                for(int j = 0; j < L; j++) {
                    if(i + j >= N || arr[x][i + j] != arr[x][i]) {
                        return false;
                    }
                }
                i += L - 1;
                count = 0;
                now = arr[x][i];
            }
            else {
                return false;
            }
        }
        return true;
    }

}

 

 

결과