[SWEA] 2001

ninano05·2026년 3월 31일

파리 퇴치!!

  • 파리가 사는 영역은 N * N인 이차원 배열
  • 파리채의 영역은 M * M인 이차원 배열
  • 파리채의 좌측 상단을 기준으로 오른쪽, 아래 이동 하기
  • 오른쪽: 열 +1
  • 아래: 행+1
  • 오른쪽 이동에서)방향 전환 조건1: 파리채 크기 M을 넘어서면 아래로 이동하기
  • 아래쪽 이동에서)방향 전환 조건2: 아래로 온 다음은 바로 오른쪽으로 전환, M을 넘어서면 탐색 종료
  • 방문할 때 만나는 파리 개수는 합한다.
  • 파리의 합을 담아두는 리스트
  • 리스트에서 최대 값을 구한다.

내 풀이 => 조건문으로 시작 위치 확인

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

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        int T = Integer.parseInt(br.readLine());

        for(int i=0; i<T; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            int[][] fly = new int[n][n]; // 파리 배열 초기화

            // 파리 배열 채우기
            for(int f=0; f<n; f++) {
                st = new StringTokenizer(br.readLine(), " ");
                for(int fn=0; fn<n; fn++) {
                    fly[f][fn] = Integer.parseInt(st.nextToken());
                }
            }

            int row = 0; // 파리채 좌측 상단 시작 행
            int col = 0; // 파리채 촤즉 상단 시작 열
            int maxSum = 0; //최대 파리 값
            int combi = (n-m+1)*(n-m+1); // 파리채 구역 개수

            // 파리 잡기
            for(int c=0; c<combi; c++) {
                int sum = 0; // 현재 파리채 파리 합
                for(int j=0; j<m; j++) {
                    for(int k=0; k<m; k++) {
                        sum += fly[row+j][col+k];
                    }
                }

                if(sum >= maxSum) maxSum = sum; // 최대 값 업데이트
                // 시작 좌표 이동
                if(col == n-m){ // 마지막 열이면 다음행 이동
                    col = 0;
                    row += 1;
                } else { // 다음 열 이동
                    col += 1;
                }
            }
            sb.append("#").append(i+1).append(" ").append(maxSum).append("\n");
        }
        bw.write(sb.toString());
        bw.flush();
        bw.close();
        br.close();
    }
}

AI 풀이 이중 반복문으로 변경

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

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        int T = Integer.parseInt(br.readLine());

        for(int i=0; i<T; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            int[][] fly = new int[n][n]; // 파리 배열 초기화

            // 파리 배열 채우기
            for(int f=0; f<n; f++) {
                st = new StringTokenizer(br.readLine(), " ");
                for(int fn=0; fn<n; fn++) {
                    fly[f][fn] = Integer.parseInt(st.nextToken());
                }
            }

            int maxSum = 0; //최대 파리 값
            // 파리 잡기
            for(int row=0; row<=n-m; row++) {
                for(int col = 0; col<=n-m; col++) {
                    int sum = 0; // 현재 파리채 파리 합
                    for(int j=0; j<m; j++) {
                        for(int k=0; k<m; k++) {
                            sum += fly[row+j][col+k];
                        }
                    }
                    if(sum > maxSum) maxSum = sum;
                }
            }
            sb.append("#").append(i+1).append(" ").append(maxSum).append("\n");
        }
        bw.write(sb.toString());
        bw.flush();
        bw.close();
        br.close();
    }
}
profile
초보 개발자

0개의 댓글