본문 바로가기
알고리즘/코드트리 문제풀이

코드트리 [자바 java] 숫자가 가장 큰 인접한 곳으로 동시에 이동

by 잔디🌿 2023. 7. 25.

    https://www.codetree.ai/missions/2/problems/move-to-max-adjacent-cell-simultaneously/description

     

    코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

    국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

    www.codetree.ai

    배열에 있는 수들과 그 곳에 위치한 구슬들이 존재할 때 해당 조건에 맞게 구슬을 움직이고, 마지막에 남은 구슬의 갯수를 구하는 문제이다.

     

    • 구슬들의 위치를 입력받을 때 이를 다른 배열에 저장해두지 않고, 새로운 격자를 만들어 해당 위치에 1로 표시했는데 이는 구슬이 겹쳐졌을 때 없애는 조치를 취하기 쉽고, 나중에 구슬의 갯수를 셀 때 모두 더하면 되니까 편리하다.
    • 구슬 주변의 숫자를 탐색할 때 dx,xy테크닉을 사용했는데,  dx,dy 배열을 만들 때 문제에서 제시한 우선순위(상하좌우)를 고려하였다.

     

    import java.io.*;
    import java.util.*;
    import java.math.*;
    
    
    public class Main {
    
        static int[][] arr;
        static int[][] mar;
        static int n;
    
        //구슬 움직이기
    
        static void move(){
            int[][] newmar = new int[n+1][n+1];
           
    
            int[] dx = {-1,1,0,0};
            int[] dy = {0,0,-1,1};
    
            for(int i = 1;i<=n;i++){
                for(int j = 1;j<=n;j++){
                    if(mar[i][j] == 1){
    
                        int max = 0;
                        int mx = 0;
                        int my = 0;
    
                        for(int k = 0;k<4;k++){
                            if( i + dx[k] >= 1 && i + dx[k] <= n &&
                                j + dy[k] >= 1 && j + dy[k] <= n && max < arr[i + dx[k]][j + dy[k]]){
                                mx = i + dx[k];
                                my = j + dy[k];
                                max = arr[i + dx[k]][j + dy[k]];
                            }
    
                        }
    
                        newmar[mx][my] += 1;
    
                    }
                }
            }
    
             for(int i = 1;i<=n;i++){
                for(int j = 1;j<=n;j++){
                    mar[i][j] = newmar[i][j];
                }
            }
            remove();
        }
    
        // 겹치는 구슬 없애기
    
        static void remove(){
            for(int i = 1;i<=n;i++){
               
                for(int j = 1;j<=n;j++){
                    
                   if(mar[i][j] >= 2){
                    mar[i][j] = 0;
                   }
                }
            }
        }
    
    
    
        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());
            int m = Integer.parseInt(st.nextToken());
            int t = Integer.parseInt(st.nextToken());
            
             arr = new int[n+1][n+1];
             mar = new int[n+1][n+1];
    
            for(int i = 1;i<=n;i++){
                st = new StringTokenizer(br.readLine());
                for(int j =1;j<=n;j++){
                    arr[i][j] = Integer.parseInt(st.nextToken());
                }
            }
    
            for(int i =0;i<m;i++){
                st = new StringTokenizer(br.readLine());
    
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
    
                mar[a][b] = 1;
            }
    
            for(int i = 0;i<t;i++){
                move();
            }
    
            int ans = 0;
            for(int i = 1;i<=n;i++){
                for(int j = 1;j<=n;j++){
                    ans += mar[i][j];
                }
            }
    
            System.out.println(ans);
        }
    }