구름 LEVEL JAVA - 폭탄 구현하기(2) (난이도 2)

» algorithm

구름 난이도 2 폭탄 구현하기(2)

문제 요약

Ⅰ. 정사각형의 땅이 N개 있을 때 N개의 폭탄을 투하하면 폭탄점수 증가.
Ⅱ. ( # )은 0점, ( 0 )은 1점, ( @ )은 2점 씩 증가.
Ⅲ. 상하좌우 (+)십자가 모양으로 인접한 땅도 같이 증가한다.
Ⅳ. 모든 땅의 폭탄 값 중 최대값은?

※ 단 입력값은 모두 1보다 크다

코드

import java.io.*;
class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 폭탄 투하시 폭탄점수 = [# : 0] , [0 : +1] , [@ : +2]
        // 떨어진 폭탄의 상하좌우 십자가(+) 모양도 똑같이 영향을 받는다,
        // 단 모든 입력 값은 1 보다 크거나 같다.
        
        String st = new StringTokenizer(br.readLine() , " ");
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        
        // 상하좌우(y , x)가 있어 2차원 배열 생성
        // 최소 입력 값이 1이라 인덱스 5개를 생성
        // 땅
        char[][] ground = new char[N + 1][N + 1];
        // 땅의 폭탄 점수
        int[][] score = new int[N + 1][N + 1];
        
        // 땅의 상태 (# , 0 , @)
        for( int i=1; i<=N i++ ) {
            st = new StringTokenizer(br.readLine() , " ");
            for( int j=1; j<=N; i++ ) {
                ground[i][j] = st.nextToken().charAt(0);
            }
        }
        
        // 폭탄 투하 인접한 땅의 값 세팅
        int[] dy = {1 , -1 , 0 , 0};
        int[] dx = {0 , 0 , 1 , -1};
        
        // 폭탄 투하
        for( i=0; i<=K; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            
            // 폭탄 투하 좌표
            int y = Integer.parseInt(st.nextToken());
            int x = Integer.parseInt(st.nextToken());
            
            // 투하지점 땅
            if( ground[y][x] == "0" ) {
                score[y][x]++;
            } else if( ground[y][x] == "@" ) {
                score[y][x] += 2;
            }
            
            // 인접한 땅
            for( int j=0; j<4; j++) {
                int tempY = y + dy[j];
                int tempX = x + dx[j];
                
                // 인접 한 땅이 있을때만
                if(inSpaceCheck(tempY , tempX , N)) {
                    if( ground[tempY][tempX] == "0" ) {
                        score[tempY][tempX]++;
                    } else if( ground[tempY][tempX] == "@" ) {
                        score[tempY][tempX] += 2;
                    }
                }
                
            }
        }
        
        // 가장 높은 값
        int result = 0;
        for( int i=1; i<=N; i++) {
            for( int j=1; j<=N; j++) {
                result = Math.max(result , score[i][j]);
            }
        }
        
        System.out.println(result);
    }
    
    // 인접한 땅이 존재하는지 체크
    public static inSpaceCheck(int y, int x, int n) {
        return y > 0 && y <= n && x > 0 && x <= n;
    }
}

풀이

  1. 땅(ground), 땅의 폭탄점수(score)는 상하좌우가 있어 2차원 배열생성,
    모든 입력 값이 최소 1 이라 배열 생성할때 입력 값의 +1 을 해준다.

  2. 땅의 상태 값은 인덱스 1부터 입력 받은 땅의 길이(N)만큼 for 문을 사용해 입력을 받고, y , x 값 2차원 배열의 값을 세팅 해야해서 이중 for 문을 사용.

  3. 상하좌우 (+)십자가 모양인 인접한 땅의 변경값을 계산할 1차원 배열 두개(dy,dx)를 세팅.

  4. 인덱스 1부터 폭탄 투하 개수(K)만큼 for 문을 사용해 투하 좌표(y,x)를 입력받는다.

  5. 입력받은 좌표를 (2)번에서 세팅한 2차원 배열인 땅의 상태값에 따른 점수를 증가 시킨다.

  6. (4)번 for 문 안에서 이중 for 문을 사용해 (3)번에서 세팅한 인접한 땅
    dy , dx 값을 입력 받은 좌표에 더해 땅이 존재하는지 체크한다.
    • 계산한 좌표의 값은 항상 0보다는 크고, 입력한 땅의 수와 같거나 작아야 한다.
  7. (6)번에서 문제가 없다면 계산한 좌표값 땅의 상태에 따른 점수를 증가시킨다.

  8. 최종적으로 이중 for 문을 돌려 점수(score) 배열에 최대값을 Math.max 함수를 이용해 찾는다.