# 유형 : 시뮬레이션

# 난이도 : 골드 4

# 문제 이해하기가 제일 어려웠다.. 경사로 놓을 수 있는 조건과 그렇지 않은 조건만 잘 체크해준다면 어렵지 않게 풀 수 있다. 가로 세로 전부 다 구해줘야 하는 문제였다.

 

한 행 또는 한 열마다 구해주면 되는데, 배열을 두개 선언하여 편하게 사용하였다. 반복문을 통해 높이 차이가 1인 부분을 찾고 L만큼 가능한지를 체크하였다. 그리고 차이가 1인 경우와 -1인 경우로 나뉘는데 1인 경우는 왼쪽이 더 높은 경우(현재 인덱스부터 경사로 설치), -1 인 경우는 오른쪽이 더 높은 경우(다음 인덱스부터 경사로 설치)이다. L만큼 설치하면서, 이미 경사로가 설치되어있거나 높이 차이가 1 또는 -1 이 아니거나 범위를 벗어나면 해당 인덱스는 불가능 한 곳이다.

 

 

    <가능한 조건>

  • 경사로는 낮은 칸에 놓으며, L개의 연속된 칸에 경사로의 바닥이 모두 접해야 한다.
  • 낮은 칸과 높은 칸의 높이 차이는 1이어야 한다.
  • 경사로를 놓을 낮은 칸의 높이는 모두 같아야 하고, L개의 칸이 연속되어 있어야 한다.

  <불가능한 조건>

  • 경사로를 놓은 곳에 또 경사로를 놓는 경우
  • 낮은 칸과 높은 칸의 높이 차이가 1이 아닌 경우
  • 낮은 지점의 칸의 높이가 모두 같지 않거나, L개가 연속되지 않은 경우
  • 경사로를 놓다가 범위를 벗어나는 경우

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
package bj;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class p14890 {
    static int N,L,result = 0;
    static int arr[][],arr2[][];
    static boolean visit[];
    
    public static void main(String[] args) throws IOException {
        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];
        arr2 = new int[N][N];
        
        for(int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<N; j++) {
                int val = Integer.parseInt(st.nextToken());
                arr[i][j] = val;
                arr2[j][i] = val;
            }
        }
        
        for(int i=0; i<N; i++) {
            solve(i, arr);
            solve(i, arr2);
        }
        System.out.println(result);
    }
    private static void solve(int index, int[][] array) {
        // TODO Auto-generated method stub
        visit = new boolean[N];
        
        for(int i=0; i<N-1; i++) {
            
            if(array[index][i] != array[index][i+1]) {
                int diff = array[index][i] - array[index][i+1];
                if(diff != -1 && diff != 1)
                    return;
                
                //왼쪽이 더 높은 경우 => 오른쪽으로 경사가 내려간다. L 만큼 경사로 설치, 현재 인덱스부터 설치
                if(diff == 1) {
                    for(int j=1; j<=L; j++) {
                        if(i+>= N || visit[i+j])
                            return;
                        
                        if(array[index][i] - 1 == array[index][i+j])
                            visit[i+j] = true;
                        else
                            return;
                    }
                }
                /// 오른쪽이 더 높은 경우 => 왼쪽으로 경사가 내려간다. L 만큼 경사로 설치, 다음 인덱스부터 설치
                else if(diff == -1) {
                    for(int j=0; j<L; j++) {
                        if(i<|| visit[i-j])
                            return;
                        
                        if(array[index][i] == array[index][i-j])
                            visit[i-j] = true;
                        else
                            return;
                    }
                }
            }
        }
        result++;
    }
}
 
cs

 

+ Recent posts