문제 링크
이 문제의 경우 구현을 하는 문제입니다.
활주로의 경우 가로의 상황과 세로의 상황을 모두 고려해야 하는 문제입니다.
각각의 행과 열에서 가능하면 카운트를 해주면 됩니다.
아래의 코드는 행을 처리하는 함수와 열을 처리하는 함수를 따로 구현해서 해결했습니다.
아래의 코드처럼 해결하지 않고, 배열을 변형해서 하나의 함수로 처리를 해줄수 있습니다.
package com.Expert;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Expert_4014 {
static int N,X;
static int map[][];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testCase = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= testCase; tc++) {
StringTokenizer st = new StringTokenizer(br.readLine()," ");
N = Integer.parseInt(st.nextToken());
X = 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());
}
}
System.out.println("#"+tc+" "+process());
}
}
private static int process() {
int count=0;
for (int i = 0; i < N; i++) {
if(makeRoadByRow(i)) ++count;
if(makeRoadByCol(i)) ++count;
}
return count;
}
private static boolean makeRoadByRow(int i) {
int beforeHeight = map[i][0];
int size = 0;
int j =0; // 탐색열 위치
while(j<N) {
if(beforeHeight == map[i][j]) {
++size;
++j;
}else if(beforeHeight+1 == map[i][j]) { // 오르막 경사로 설치 가능한지 판단
if(size<X) return false; // 경사로 설치 불가
beforeHeight++;
size=1;
++j;
}else if(beforeHeight-1 == map[i][j]) { // 내리막 경사로 설치 가능한지 판단
int count=0;
for (int k = j; k < N; k++) {
if(map[i][k] !=beforeHeight-1) break;
if(++count==X)break;
}
if(count<X) return false; // 경사로 설치 불가
beforeHeight--;
size = 0;
j+=X;
}else {
return false;
}
}
return true;
}
private static boolean makeRoadByCol(int i) {
int beforeHeight = map[0][i];
int size = 0;
int j =0; // 탐색행 위치
while(j<N) {
if(beforeHeight == map[j][i]) {
++size;
++j;
}else if(beforeHeight+1 == map[j][i]) { // 오르막 경사로 설치 가능한지 판단
if(size<X) return false; // 경사로 설치 불가
beforeHeight++;
size=1;
++j;
}else if(beforeHeight-1 == map[j][i]) { // 내리막 경사로 설치 가능한지 판단
int count=0;
for (int k = j; k < N; k++) {
if(map[k][i] !=beforeHeight-1) break;
if(++count==X)break;
}
if(count<X) return false; // 경사로 설치 불가
beforeHeight--;
size = 0;
j+=X;
}else {
return false;
}
}
return true;
}
}
- Step1. 배열에 값을 받아온다.
- Step2. 받아온 값을 가지고 행과 열로 나눠서 오르막 설치가 가능한지 판단을 하는 코드를 짠다.
'Algorithm > SWEA 알고리즘' 카테고리의 다른 글
SWEA_5644 무선충전(자바) (0) | 2021.04.20 |
---|---|
SWEA_5656 벽돌깨기(자바) (0) | 2021.04.20 |
SWEA_1251 하나로(자바) / 최소신장트리 (0) | 2021.04.13 |
SWEA_1249 보급로(자바) / BFS (0) | 2021.04.12 |
SWEA_4408 자기 방으로 돌아가기(자바) (0) | 2021.03.27 |