본문 바로가기

백준/삼성기출

경사로- Java, 구현

728x90

www.acmicpc.net/problem/14890

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

package Samsung;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

//경사로
public class Incline {

    static int n, l;
    static int[][] arr;
    static boolean[][] check;
    static int count = 0;

    static int[] dx = {-1, 1, 0, 0}; //위, 아래, 왼, 오
    static int[] dy = {0, 0, -1, 1};


    static boolean canGo(int x, int y, int num) {
        return x >= 0 && y >= 0 && x < n && y < n && arr[x][y] == num;
    }


    public static void main(String[] args) throws IOException {

        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];
        check = new boolean[n][n];

        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(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[] visited = new boolean[n];
     int[] height = new int[n];

     for(int i=0; i<n; i++){
         height[i] = (dir==0)? arr[x][y+i] : arr[x+i][y];
     }

     for(int i=0; i<n-1; i++){
         if(height[i]==height[i+1]){
             continue;
         }

         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++){
                 if(j>=n || visited[j] || height[j]!=height[i+1]){
                     return false;
                 }
                 visited[j]= true;
             }
         }
         else if (height[i] + 1 == height[i + 1]) {
             for (int j = i; j > i - l; j--) {
                 if (j < 0 || visited[j] || height[j] != height[i]) {
                     return false;
                 }
                 visited[j] = true;
             }
         }
     }
        return true;
    }
}

- 같은 행 안에서 혹은 같은 열안에서 경사로 부분이 겹치지 않게 하면 된다. -> 처음에 같은 행과 열끼리 아니더라도 이미 경사로 만든 부분은 만들면 안되는 줄 암. 문제조건을 제대로 파악하자!

'백준 > 삼성기출' 카테고리의 다른 글

감시/JAVA  (0) 2021.04.05
톱니바퀴  (0) 2021.04.05
스타트와 링크 - Java, 백트래킹  (0) 2021.04.01
주사위 굴리기  (0) 2021.03.27
시험감독  (0) 2021.03.25