ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2001. 파리 퇴치 - 자바(JAVA)
    알고리즘/SW Expert Academy 2022. 2. 23. 00:01
    728x90

    https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PzOCKAigDFAUq 

     

    SW Expert Academy

    SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

    swexpertacademy.com

     

    문제 해석

    N x N 배열 안의 숫자는 해당 영역에 존재하는 파리의 개수를 의미한다.

    M x M 크기의 파리채를 한 번 내려쳐 최대한 많은 파리를 죽이고자 할 때 죽은 파리의 개수를 구하라

     

    예를 들어 M=2이고, N = 5인 경우의 정답은 49이다.

    입력

    가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스 주어진다.

    각 테스트 케이스의 첫번째 줄에 N과 M이 주어집니다.

    다음 N개의 줄에 걸쳐 N x N 배열이 주어집니다.

     

    제약조건

    5<= N <=15

    2 <=M <= N

    출력

    출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.
    (t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

     

    문제 풀이 전 설계

    N x N 배열을 입력받고 0~N까지 검사를 M x M 크기로 검사를 해야 한다.

    이때 배열이 초과하지 않도록 범위를 잘 설정하는 게 포인트다.

     

    코드

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class flyAway {
    
    	static int[][] flyBoard;
    	static int N, M;
    	static BufferedReader br;
    
    	public static void main(String[] args) throws IOException {
    		// TODO Auto-generated method stub
    		br = new BufferedReader(new InputStreamReader(System.in));
    		int T = Integer.parseInt(br.readLine());
    		for (int t = 1; t <= T; t++) {
    			inputFlyBooardInfo();
    			int maxFlyCount = getMaxFlyCount();			
    			printMaxFlyCount(t, maxFlyCount);
    		}
    	}
    	
    	private static void inputFlyBooardInfo() throws IOException {
    		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    		N = Integer.parseInt(st.nextToken());
    		M = Integer.parseInt(st.nextToken());
    
    		flyBoard = new int[N][N];
    
    		for (int i = 0; i < N; i++) {
    			st = new StringTokenizer(br.readLine(), " ");
    			for (int j = 0; j < N; j++) {
    				flyBoard[i][j] = Integer.parseInt(st.nextToken());
    			}
    		}
    	}
    
    	private static int getMaxFlyCount() {
    		int max = 0;
            //i,j for문은 탐색을 시작할 영역을 순회
            //k,l for문은 해당 영역에서부터 M x M 만큼 탐색
    		for (int i = 0; i <= N - M; i++) {
    			for (int j = 0; j <= N - M; j++) {
    				int sum = 0;
    				for (int k = 0; k < M; k++) {
    					for (int l = 0; l < M; l++) {
    						sum += flyBoard[i + k][j + l];
    					}
    				}
    				max = max > sum ? max : sum;
    			}
    		}
    		return max;
    	}
    	
    	private static void printMaxFlyCount(int t, int maxFlyCount) {
    		StringBuilder sb = new StringBuilder();
    		sb.append("#" + t + " ");
    		sb.append(maxFlyCount + "\n");
    		System.out.print(sb.toString());
    	}
    
    }

     

     

     

    댓글

Designed by Tistory.