코드굽는 타자기

SWEA[4014] - 활주로 건설 본문

알고리즘/Simulation

SWEA[4014] - 활주로 건설

bright-jun 2020. 2. 9. 15:24

링크

SWEA[4014]

문제설명

  • 시뮬

문제풀이

  • 시뮬

문제코드

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

public class Solution4131 {
    public static int[][] map;
    public static int[][] map2;
    public static boolean[][] set;
    public static int N=0;
    public static int X=0;
    public static void main(String[] args) throws IOException {
        System.setIn(new FileInputStream("res/swea/4131.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int T=Integer.parseInt(br.readLine());
        for (int test_case = 1; test_case <= T; test_case++) {
            int ans=0;
//            입력
            st = new StringTokenizer(br.readLine()," ");
            N = Integer.parseInt(st.nextToken());
            X = Integer.parseInt(st.nextToken());
            map = new int[N][N];
            map2 = 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());
                    map2[j][i]=map[i][j];
                }
            }

            int idx=0;
            //가로
            set = new boolean[N][N];
            for (int i = 0; i < N; i++) {
                idx=0;
                top:
                while(true) {
                    if(idx==N-1) {    //끝까지 이상없이 왔음.
                        ans++;
                        break;
                    }
                    if(map[i][idx]==map[i][idx+1]) {    //높이가 같으면 다음칸 감
                        idx++;
                    }
                    else if(map[i][idx]-1==map[i][idx+1]) {    //1칸 내려감
                        for (int s = 1; s <= X; s++) {
                            //경계안이고, 높이1칸차이 유지하면서, 설치안되었으면
                            if((idx+s)<N && map[i][idx]-1 == map[i][idx+s] && set[i][idx+s]==false) {
                                set[i][idx+s]=true;
                            }
                            else {    //설치 못함
                                break top;
                            }
                        }
                        //X칸 설치 다끝남
                        idx = idx+X;
                    }
                    else if(map[i][idx]+1==map[i][idx+1]) {
                        for (int s = 0; s < X; s++) {
                            //경계안이고, 높이1칸차이 유지하면서, 설치안되었으면
                            if((idx-s)>=0 && map[i][idx+1]-1 == map[i][idx-s] && set[i][idx-s]==false) {
                                set[i][idx-s]=true;
                            }
                            else {    //설치 못함
                                break top;
                            }
                        }
                        //X칸 설치 다끝남
                        idx++;
                    }
                    else {    //높이차이 2칸이상
                        break;
                    }
                }
            }
            //세로
            set = new boolean[N][N];
            for (int i = 0; i < N; i++) {
                idx=0;
                top:
                while(true) {
                    if(idx==N-1) {    //끝까지 이상없이 왔음.
                        ans++;
                        break;
                    }
                    if(map2[i][idx]==map2[i][idx+1]) {    //높이가 같으면 다음칸 감
                        idx++;
                    }
                    else if(map2[i][idx]-1==map2[i][idx+1]) {    //1칸 내려감
                        for (int s = 1; s <= X; s++) {
                            //경계안이고, 높이1칸차이 유지하면서, 설치안되었으면
                            if((idx+s)<N && map2[i][idx]-1 == map2[i][idx+s] && set[i][idx+s]==false) {
                                set[i][idx+s]=true;
                            }
                            else {    //설치 못함
                                break top;
                            }
                        }
                        //X칸 설치 다끝남
                        idx = idx+X;
                    }
                    else if(map2[i][idx]+1==map2[i][idx+1]) {
                        for (int s = 0; s < X; s++) {
                            //경계안이고, 높이1칸차이 유지하면서, 설치안되었으면
                            if((idx-s)>=0 && map2[i][idx+1]-1 == map2[i][idx-s] && set[i][idx-s]==false) {
                                set[i][idx-s]=true;
                            }
                            else {    //설치 못함
                                break top;
                            }
                        }
                        //X칸 설치 다끝남
                        idx++;
                    }
                    else {    //높이차이 2칸이상
                        break;
                    }
                }
            }

            System.out.println("#"+test_case+" "+ans);
            /*
             * 초기화
             */
        }//end test_case
    }//end main
}

아쉬운점

  • idx = idx++; 하면 idx++안되고 idx그대로 유지됨... 잘못썼음.
  • loop돌면 idx 초기화시켜줘야하는데 안했음.
  • 세로로 check하는거를 index바꿔가면서 index고려하기 귀찮아서 그냥 transpose한 배열 새로 만들어서 돌림.

잘한점

  • 예전에 하루종일풀었는데 이젠 빠르게 풀었음(40분)
  • 다리 설치되었는지 체크를 boolean 배열을 만들어서 체크함.
Comments