1. 문제
https://www.acmicpc.net/problem/14890
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;
}
}
결과
'코딩문제풀이 > Baekjoon' 카테고리의 다른 글
[Java] 백준 19583번 : 싸이버개강총회 (0) | 2023.01.05 |
---|---|
[Java] 백준 5014번 : 스타트링크 (0) | 2023.01.04 |
[Java] 백준 2251번 : 물통 (0) | 2023.01.02 |
[Java] 백준 20055번 : 컨베이어 벨트 위의 로봇 (0) | 2023.01.02 |
[Java] 백준 2751번 : 수 정렬하기 2 (0) | 2022.12.31 |