# 유형 : 시뮬레이션
# 난이도 : 골드 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+j >= 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<j || visit[i-j])
return;
if(array[index][i] == array[index][i-j])
visit[i-j] = true;
else
return;
}
}
}
}
result++;
}
}
|
cs |
'백준' 카테고리의 다른 글
#백준_3085 사탕 게임 - Java 자바 (0) | 2020.03.28 |
---|---|
#백준_17143 낚시왕 - Java 자바 (0) | 2020.03.26 |
#백준_13458 시험 감독 - Java 자바 (0) | 2020.03.25 |
#백준_16235 나무 재테크 - Java 자바 (0) | 2020.03.24 |
#백준_17136 색종이 붙이기 - Java 자바 (0) | 2020.03.23 |