코드와이
[BAEKJOON] 14890. 경사로 본문
문제링크
https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
package acmicpc.Gold3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 경사로 {
static int n, l, map[][], ans;
static boolean[][] build;
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());
map = new int[n][n];
for(int i = 0 ; i < n ; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0 ; j < n ; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
ans = 0;
for(int i = 0 ; i < n ; i++) {
build = new boolean[n][n];
if(check(i)) {
ans++;
}
build = new boolean[n][n];
if(check2(i)) {
ans++;
}
}
System.out.println(ans);
}
public static boolean check(int idx) {
int prev = map[idx][0];
for(int i = 1 ; i < n ; i++) {
if(Math.abs(prev - map[idx][i]) >= 2) return false;
if(prev == map[idx][i]) continue;
if(prev + 1 == map[idx][i]) {
if(i <= l - 1) return false;
else {
for(int j = 1 ; j <= l ; j++) {
if(map[idx][i-j] != prev || build[idx][i-j]) return false;
build[idx][i-j] = true;
}
prev = map[idx][i];
}
} else if(prev - 1 == map[idx][i]) {
if(i + l > n) return false;
else {
build[idx][i] = true;
for(int j = 1 ; j < l ; j++) {
if(map[idx][i+j] != map[idx][i]) return false;
build[idx][i+j] = true;
}
prev = map[idx][i];
}
}
}
return true;
}
public static boolean check2(int idx) {
int prev = map[0][idx];
for(int i = 1 ; i < n ; i++) {
if(Math.abs(prev - map[i][idx]) >= 2) return false;
if(prev == map[i][idx]) continue;
if(prev + 1 == map[i][idx]) {
if(i <= l - 1) return false;
else {
for(int j = 1 ; j <= l ; j++) {
if(map[i-j][idx] != prev || build[i-j][idx]) return false;
build[i-j][idx] = true;
}
prev = map[i][idx];
}
} else if(prev - 1 == map[i][idx]) {
if(i + l > n) return false;
else {
build[i][idx] = true;
for(int j = 1 ; j < l ; j++) {
if(map[i+j][idx] != map[i][idx]) return false;
build[i+j][idx] = true;
}
prev = map[i][idx];
}
}
}
return true;
}
}
'acmicpc' 카테고리의 다른 글
[BAEKJOON] 16234. 인구 이동 (0) | 2021.06.16 |
---|---|
[BAEKJOON] 1937. 욕심쟁이 판다 (0) | 2021.06.14 |
[BAEKJOON] 2250. 트리의 높이와 너비 (0) | 2021.06.02 |
[BAEKJOON] 12738. 가장 긴 증가부분 수열3 (0) | 2021.05.29 |
[BAEKJOON] 2352. 반도체 설계 (0) | 2021.05.28 |