Algorithm Study/Java

[코트드리/Java] 최적의 십자 모양 폭발

728x90
반응형

풀이🛫

import java.util.Scanner; 

public class Main {
    public static final int DIR_NUM = 4; 
    public static final int MAX_N = 50;

    public static final int[] dx = new int[]{-1,0,1,0};
    public static final int[] dy = new int[]{0,1,0,-1};
    
    public static int n, ans;

    public static int[][] orgGrid = new int[MAX_N][MAX_N];
    public static int[][] grid = new int[MAX_N][MAX_N];
    public static int[][] temp = new int[MAX_N][MAX_N];
    public static boolean[][] visited = new boolean[MAX_N][MAX_N];

    public static void initializeGrid() {
        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                grid[i][j] = orgGrid[i][j];
            }
        }
    }

    public static void initializeVisited() {
        for (int i=0; i<n ;i++) {
            for (int j=0; j<n; j++) {
                visited[i][j] = false; 
            }
        }
    }

    public static boolean inRange(int x, int y) {
        return 0<=x && x<n && 0<=y && y<n;
    }

    public static void initializeTemp() {
        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                temp[i][j] = 0;
            }
        }
    }

    public static void explode(int x, int y, int power) {
        for (int d=0; d<DIR_NUM; d++) {
            for (int p=0; p<power; p++){
                int nx = x + dx[d]*p;
                int ny = y + dy[d]*p;
                
                if (inRange(nx, ny)) {
                    grid[nx][ny] = 0;
                }
            }
        }
    }

    // **i, j 확인 순서 주의
    public static void drop() {  
        initializeTemp();

        for (int j=0; j<n; j++) {
            int currIdx = n-1; 

            for (int i=n-1; i>=0; i--) {
                if (grid[i][j] == 0) continue;  // *빠지면 안됨
                temp[currIdx--][j] = grid[i][j];
            }
        }

        // grid 업데이트: temp
        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                grid[i][j] = temp[i][j];
            }
        }
    }

    public static int cntPair() {
        initializeVisited();  // *초기화 필수: 시간 많이 잡아먹힘
        int ret = 0;

        for (int x=0; x<n; x++) {
            for (int y=0; y<n; y++) {
                if (grid[x][y] == 0) continue;

                for (int d=0; d<DIR_NUM; d++) {
                    int nx = x+dx[d];
                    int ny = y+dy[d];

                    if (inRange(nx, ny) && (grid[x][y]==grid[nx][ny]) && (!visited[x][y]||!visited[nx][ny])) {
                        ret ++; 
                        visited[x][y] = true;
                        visited[nx][ny] = true;
                    }
                }
            }
        }
        return ret;
    }

    public static int pairCnt(int x, int y) {
        initializeGrid();
        int ret = -1;

        explode(x, y, grid[x][y]);
        drop();
        ret = Math.max(ret, cntPair());

        return ret;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();

        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                orgGrid[i][j] = sc.nextInt();
            }
        }

        initializeGrid();

        for (int i=0; i<n; i++) { 
            for (int j=0; j<n; j++){
                ans = Math.max(ans, pairCnt(i, j));
            } 
        }
        
        System.out.println(ans);
    }
}

 

핵심 정리🎁

public static int pairCnt(int x, int y) {
    ..
    explode(x, y, grid[x][y]); 
    drop();
    ret = Math.max(ret, cntPair());
    ..
}
  • 폭발 / 떨어뜨리기 / 쌍 개수 구하기로 구분해서 풀이 진행

 

링크💎

https://www.codetree.ai/missions/2/problems/best-cross-shape-bomb?&utm_source=clipboard&utm_medium=text

 

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

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

www.codetree.ai

 

후기 😎

  • 초기화 메서드를 꼼꼼히 적용하자
    • 허투른 곳에서 시간/에너지 낭비를 꽤 했다..

 

 

 

'Algorithm Study > Java' 카테고리의 다른 글

[코드트리/Java] 금 채굴하기  (2) 2023.08.28
프로세스와 쓰레드 (by 얄코)  (0) 2023.05.23
자바에서 static 변수의 사용  (0) 2023.05.22
[BOJ JAVA] #2750 수 정렬하기  (0) 2023.02.19
[자바의 정석] 기초편  (0) 2022.01.13