반응형
가로 세로 길이 있는지 판별하는 문제 => 구현문제였다.
가로, 세로 배열에 대하여 1차원배열로 추출해서 앞뒤연산을 구현하는 문제이다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] map;
static int n;
static int l;
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());
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 count = 0;
for (int i = 0; i < n; i++) {
if (go(i, 0, 0)) {//가로
count++;
}
if (go(0, i, 1)) {//세로
count++;
}
}
System.out.println(count);
}
static boolean go(int x, int y, int dir) {
boolean[] bridged = new boolean[n];
int[] height = new int[n];
for (int i = 0; i < n; i++) {
if (dir == 0) height[i] = map[x][y + i];//가로배열 복사
else height[i] = map[x + i][y];//세로배열 복사
}
for (int i = 0; i < n - 1; i++) {
if (height[i] == height[i + 1]) {//같으면 전진
continue;
}
//1보다 크게 차이나면 무조건 실패
if (Math.abs(height[i] - height[i + 1]) > 1) {
return false;
}
//오른쪽이 더 큰경우
if (height[i] - 1 == height[i + 1]) {
for (int j = i + 1; j <= i + l; j++) {
//overflow || bridge세움 || 다리길이보다 짧은평지
if (j >= n || bridged[j] || height[j] != height[i + 1]) {
return false;
}
bridged[j] = true;
}
}//왼쪽이 더 큰경우
else if (height[i] + 1 == height[i + 1]) {
for (int j = i; j > i - l; j--) {
//underflow || bridge세움 || 다리길이보다 짧은평지
if (j < 0 || bridged[j] || height[j] != height[i]) {
return false;
}
bridged[j] = true;
}
}
}
return true;
}
}
반응형
'코딩테스트 > Java' 카테고리의 다른 글
[JAVA] 백준 게리맨더링2 (0) | 2021.10.05 |
---|---|
[JAVA] 백준 어른상어 (0) | 2021.10.05 |
(2021 카카오) 합승 택시 요금 JAVA (0) | 2021.09.24 |
[JAVA] 백준 마법사 상어와 비바라기 (0) | 2021.09.23 |
[JAVA] 백준 사다리 조작 (0) | 2021.09.16 |