[백준] 14890 - 경사로

­Valentine·2022년 3월 9일
0

Algorithm

목록 보기
14/22

14890번: 경사로

  • 코드
    package review;
    
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.StringTokenizer;
    
    public class ex_14890 {
        static int N,L;
        static int[][]map,slide;
        public static void main(String[] args) throws IOException {
            System.setIn(new FileInputStream("input/14890.txt"));
            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];
            slide=new int[N][N];
            int answer=0;
    
            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());
                }
            }
    
            for(int i=0;i<N;i++){
                int pre=map[i][0];
                boolean flag=false;
    
                for(int j=1;j<N;j++){
                    int now=map[i][j];
    
                    if(Math.abs(now-pre)>1) flag=true;
                    else if(pre!=now) flag=checkR(i,j);
    
                    if(flag) break;
                    pre=now;
                }
    
                if(!flag) {
                    answer++;
                }
            }
            slide=new int[N][N];
            for(int i=0;i<N;i++){
                int pre=map[0][i];
                boolean flag=false;
    
                for(int j=1;j<N;j++){
                    int now=map[j][i];
    
                    if(Math.abs(now-pre)>1) flag=true;
                    else if(pre!=now) flag=checkC(j,i);
    
                    if(flag) break;
                    pre=now;
                }
    
                if(!flag) {
                    answer++;
                }
            }
            System.out.println(answer);
        }static boolean checkR(int x, int y){
            if(map[x][y-1]-map[x][y]==1){
                if(y>N-L) return true;
                else{
                    for(int i=0;i<L;i++){
                        if(slide[x][y+i]>0) return true;
                        slide[x][y+i]++;
                    }
                }
            }else{
                if(y<L) {
                    return true;
                }
                else{
                    for(int i=1;i<=L;i++){
                        if(slide[x][y-i]>0) return true;
                        slide[x][y-i]++;
                    }
                }
            }
            return false;
        }static boolean checkC(int x, int y){
            if(map[x-1][y]-map[x][y]==1){
                if(x>N-L) return true;
                else{
                    for(int i=0;i<L;i++){
                        if(slide[x+i][y]>0) return true;
                        slide[x+i][y]++;
                    }
                }
            }else{
                if(x<L) {
                    return true;
                }
                else{
                    for(int i=1;i<=L;i++){
                        if(slide[x-i][y]>0) return true;
                        slide[x-i][y]++;
                    }
                }
            }
            return false;
        }
    }
  • 아이디어
    • 가로줄 따로 세로줄 따로 확인
    • 경사로를 놓을 수 있는 경우 겹치는지 확인하기 위해 slide 배열 활용
profile
천체관측이 취미

0개의 댓글