[java] 17837 새로운 게임 2

ideal dev·2023년 2월 6일
0

코딩테스트

목록 보기
58/69

문제 링크
: https://www.acmicpc.net/problem/17837

구현...
문제푸는데 하루종일 걸렸지만 너무 재밌었당~~

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

class horse{
    int x,y,dist;
    horse(int x, int y, int dist){
        this.x = x ;
        this.y = y;
        this.dist = dist ;
    }
}

class Main {
    static int N,K,count; 
    static int[][] map ;
    static horse[] horse_info;
    static ArrayList<Integer>[][] horses ;

    public static int stoi(String s){
        return Integer.parseInt(s);
    }

    public static void main(String[] args) throws Exception {
        // 값 입력받기
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = stoi(st.nextToken());
        K = stoi(st.nextToken());

        map = new int[N][N]; // 체스판 색 정보
        horse_info = new horse[K]; // 1~K개의 말 정보 
        horses = new ArrayList[N][N]; // 말 위치

        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++) horses[i][j] = new ArrayList<>();
        }

        for(int i=0;i<N;i++){ // 체스판 색 정보
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<N;j++){
                map[i][j] = stoi(st.nextToken());
            }
        }

        for(int i=0;i<K;i++){ // 말 정보 : 행,열,이동 방향
            st = new StringTokenizer(br.readLine());
            int x = stoi(st.nextToken())-1;
            int y = stoi(st.nextToken())-1;
            int dist = stoi(st.nextToken())-1;
            horse_info[i] = new horse(x, y, dist); // 말 정보에 해당 말 추가
            horses[x][y].add(i); // 말 위치에 해당 말 추가
        }
        
        while(true){
            if (count >= 1000){
                break;
            }
            count ++ ;
            // 말 1번부터 K번까지 이동
            MovePiece();
        }

        System.out.println(-1);
    }

    static int[] dy = {1,-1,0,0}, dx = {0,0,-1,1}; // → 1 , ← 2 , ↑ 3 , ↓ 4 우좌상하

    public static void MovePiece(){

        for(int i=0; i<K;i++){ // 현재 말
            // 기존 정보
            int x = horse_info[i].x; 
            int y = horse_info[i].y;
            int dist = horse_info[i].dist;

            // 이동한 좌표
            int xx = x + dx[dist]; 
            int yy = y + dy[dist];

            // 영역을 벗어나거나 파란색인 경우
            if(xx<0 || xx>=N || yy<0 || yy>=N || map[xx][yy] == 2 ){
                // 방향을 바꿈
                horse_info[i].dist = (dist == 0 | dist == 1)? 1-dist : 5-dist ;
                // 방향을 바꾼 뒤의 좌표
                xx = x + dx[horse_info[i].dist];
                yy = y + dy[horse_info[i].dist];
                if(xx<0 || xx>=N || yy<0 || yy>=N || map[xx][yy] == 2) continue;
            }

            // 흰색이나 빨간색인 경우
            boolean check = false ;
            ArrayList<Integer> temp = new ArrayList<>();

            // 이동할 말 temp에 담기
            for(int j=0;j<horses[x][y].size();j++){ // 현재좌표의 말들을 확인
                int now = horses[x][y].get(j);
                if(now == i) check = true ; // 현재 말 확인, 현재 말부터 좌표이동 시작
                if(check){
                    horse_info[now].x = xx ;
                    horse_info[now].y = yy ;
                    temp.add(now);
                    horses[x][y].remove(j);
                    j--;
                }
            }

            // 다음 좌표로 이동
            if(map[xx][yy]==0){
                for(int j=0;j<temp.size();j++){
                    horses[xx][yy].add(temp.get(j));
                }
            }else{
                for(int j=temp.size()-1;j>=0;j--){
                    horses[xx][yy].add(temp.get(j));
                }
            }

            // 4개 이상 확인
            if(horses[xx][yy].size() >= 4){
                System.out.println(count);
                System.exit(0);
            }



        }



    }
}


0개의 댓글