풀이
문제에서 주어진 조건에 맞추어 해결했습니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
public static int N, X;
public static int[][] map;
public static boolean[] isSelected;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder("");
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; ++tc) {
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());
}
}
int answer = 0;
for (int i = 0; i < N; ++i) {
isSelected = new boolean[N];
if (goX(i, 0)) {
answer++;
}
isSelected = new boolean[N];
if (goY(0, i)) {
answer++;
}
}
sb.append("#").append(tc).append(" ").append(answer).append("\n");
}
System.out.println(sb);
}
public static boolean goX(int y, int x) {
for (int i = 0; i < N - 1; ++i) {
int idx = x + i + 1;
int height = map[y][idx] - map[y][x + i];
if (height == 1) {
for (int j = i; j > i - X; j--) {
if (j < 0) {
return false;
}
if (map[y][idx] - map[y][j] != 1) {
return false;
}
if (isSelected[j]) {
return false;
}
isSelected[j] = true;
}
}
else if (height == -1) {
for (int j = idx; j < idx + X; ++j) {
if (j >= N) {
return false;
}
if (map[y][j] - map[y][i] != -1) {
return false;
}
if (isSelected[j]) {
return false;
}
isSelected[j] = true;
}
}
else if (height > 1 || height < -1) {
return false;
}
}
return true;
}
public static boolean goY(int y, int x) {
for (int i = 0; i < N - 1; ++i) {
int idx = y + i + 1;
int height = map[idx][x] - map[y + i][x];
if (height == 1) {
for (int j = i; j > i - X; j--) {
if (j < 0) {
return false;
}
if (map[idx][x] - map[j][x] != 1) {
return false;
}
if (isSelected[j]) {
return false;
}
isSelected[j] = true;
}
}
else if (height == -1) {
for (int j = idx; j < idx + X; ++j) {
if (j >= N) {
return false;
}
if (map[j][x] - map[i][x] != -1) {
return false;
}
if (isSelected[j]) {
return false;
}
isSelected[j] = true;
}
}
else if (height > 1 || height < -1) {
return false;
}
}
return true;
}
}
'알고리즘 > SWEA' 카테고리의 다른 글
[Java] SWEA 1267번 작업순서 (0) | 2021.05.30 |
---|---|
[Java] SWEA 1263번 사람 네트워크2 (0) | 2021.05.24 |
[Java] SWEA 2115번 벌꿀채취 (0) | 2021.05.23 |
[Java] SWEA 5644번 무선충전 (0) | 2021.05.08 |
[Java] SWEA 4530번 극한의 청소 작업 (0) | 2021.05.04 |