코딩테스트/Java

[JAVA] 백준 경사로

SK_MOUSE 2021. 9. 28. 16:29
반응형

https://www.acmicpc.net/problem/14890

가로 세로 길이 있는지 판별하는 문제 => 구현문제였다.

 

가로, 세로 배열에 대하여 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