알고리즘

백준 14890 JAVA

infobox503 2024. 7. 8. 10:32

문제 유형

  • 시뮬레이션, 완전탐색

문제 접근

    • 경사로를 배치할 수 있는 행, 열의 총 개수
  • 주어지는 정보
    • 지도 크기 N*N = 10,000
    • 경사로 배치를 위한 연산 L = 100
    • 최대 시간복잡도는 10,000 * 100보다 작음
    • ⇒ 완전 탐색 가능
    • ⇒ 시뮬레이션 가능

 

import java.util.*;
import java.io.*;


class Main{
    public static int[][] map;
    public static boolean[][] visited;
    public static int N;
    public static int ramp;
    
    public static boolean Col(int x)
    {
        //lock_x
        for(int i = 1; i<N; i++)
        {
            int target = map[i-1][x];
            int cur = map[i][x];
            
            int interval = Math.abs(target-cur);
            if(interval >= 2)
            {
                return false;
            }
            
            
            if(target == cur)
            {
                continue;
            }
            
            //high
            else if(target > cur)
            {
                int distance = ramp;
                int moveY = i;
                while(distance > 0)
                {
                    if(moveY < 0 || moveY >= N || visited[moveY][x] == true || map[moveY][x] != cur)
                    {
                        return false;
                    }
                    visited[moveY][x] = true;
                    moveY++;
                    distance--;
                }
            }
            
            //low
            else
            {
                int distance = ramp;
                int moveY = i-1;
                while(distance > 0)
                {
                    if(moveY < 0 || moveY >= N || visited[moveY][x] == true || map[moveY][x] != target)
                    {
                        return false;
                    }
                    visited[moveY][x] = true;
                    moveY--;
                    distance--;
                }
            }
        }
        
        return true;
    }
    
    
    
    public static boolean Row(int y)
    {
        //lock_y
        for(int i = 1; i<N; i++)
        {
            int target = map[y][i-1];
            int cur = map[y][i];
            
            int interval = Math.abs(target-cur);
            if(interval >= 2)
            {
                return false;
            }
            
            
            if(target == cur)
            {
                continue;
            }
            
            //high
            else if(target > cur)
            {
                int distance = ramp;
                int moveX = i;
                while(distance > 0)
                {
                    if(moveX < 0 || moveX >= N || visited[y][moveX] == true || map[y][moveX] != cur)
                    {
                        return false;
                    }
                    visited[y][moveX] = true;
                    moveX++;
                    distance--;
                }
            }
            
            //low
            else
            {
                int distance = ramp;
                int moveX = i-1;
                while(distance > 0)
                {
                    if(moveX < 0 || moveX >= N || visited[y][moveX] == true || map[y][moveX] != target)
                    {
                        return false;
                    }
                    visited[y][moveX] = true;
                    moveX--;
                    distance--;
                }
            }
        }
        
        return true;
    }
    
    public static void reset(boolean[][] visited)
    {
        for(int i = 0; i<visited.length; i++)
        {
            for(int j = 0; j<visited.length; j++)
            {
                visited[i][j] = false;
            }
        }
    }
    
    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());
        ramp = Integer.parseInt(st.nextToken());
        
        map = new int[N][N];
        visited = new boolean[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 result = 0;
        for(int i = 0; i<N; i++)
        {
            if(Row(i))
            {
                result++;
            }
        }
        reset(visited);
        for(int i = 0; i<N; i++)
        {
            if(Col(i))
            {
                result++;
            }
        }
        System.out.println(result);
        
    }
}

'알고리즘' 카테고리의 다른 글

백준 16235 JAVA  (0) 2024.07.10
백준 14891 JAVA  (0) 2024.07.09
백준 14502 JAVA  (1) 2024.07.05
백준 14502 JAVA  (0) 2024.07.04
백준 14500 JAVA  (0) 2024.07.03