본문으로 바로가기

[백준 14890] 경사로 -JAVA // le_effort//

category 알고리즘 2020. 3. 12. 19:05

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

 

14890번: 경사로

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

www.acmicpc.net

 

길이가 L인 경사로를 설치 할 때 인덱스 벗어나는걸 처리해주기가 까다로운 문제였다...

 

경사로는 크게 2개가 있다.

올라가는 경사로와 내려가는 경사로가 있는데 이를 따로따로 구현을 해주면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import java.io.*;
import java.util.*;
public class Main {
    static int n,l;
    static int map[][];
    static int cnt=0;
    static boolean visited[][];
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String[] t = br.readLine().split(" ");
        n = Integer.parseInt(t[0]);
        l = Integer.parseInt(t[1]);    // 경사로의 길이
        
        map = new int[n][n];
        visited = new boolean [n][n];
        
        for(int i=0; i<n; i++) {
            String[] input = br.readLine().split(" ");
            for(int j=0; j<n; j++) {
                map[i][j] = Integer.parseInt(input[j]);
            }
        }
        for(int i=0; i<n; i++) {
            if(isPossible(i,0,0)) {
                cnt++;
            }
            if(isPossible(0,i,1)) {
                cnt++;
            }
        }
        System.out.println(cnt);
    }
    public static boolean isPossible(int x, int y, int d) {
        int arr[] = new int[n];
        boolean[] visited = new boolean[n];
        if(d==0) {    // 가로
            for(int i=0; i<n; i++) {
                arr[i] = map[i][x];
            }
        }
        else {    // 세로
            for(int i=0; i<n; i++) {
                arr[i] = map[y][i];
            }
        }
        for(int i=0; i<n-1; i++) {
            if(arr[i]==arr[i+1]) {
                continue;
            }        // 같은 경우는 경사로를 구할 필요가 없다.
            
            if(Math.abs(arr[i]-arr[i+1])!=1) {
                return false;        // 경사로는 최대길이가 1이니 해당하지 않는다면 false다
            }
            
            if(arr[i] > arr[i+1]) {        // 내려가는 경사로 일 경우
                for(int j=i+1; j<=i+l; j++) {
                    if(j>n-1) {        // 경사로가 범위를 벗어나면 false
                        return false;
                    }
                    if(visited[j] || arr[j]!=arr[i]-1) {
                        return false;    // 경사로를 겹치게 놓을수 없다
                    }
                    visited[j] = true;
                }
            }
            else if(arr[i] < arr[i+1]) {    //올라가는 경사로 일 경우
                for(int j=i; j>i-l; j--) {
                    if(j<0) {
                        return false;
                    }
                    if(visited[j] || arr[j]!=arr[i+1]-1) {
                        return false;
                    }
                    visited[j] = true;
                }
            }
        }
        return true;
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
white">cs