알고리즘

[SWEA2805/Java] 농작물 수확하기

IT 참다랑어 2023. 8. 1. 19:27

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

 

SW Expert Academy

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

swexpertacademy.com

해당 문제는 일정 범위 안에 포함된 농작물의 양을 구하는 문제로

범위는 농장의 크기(N*N, N은 홀수 & 1<=N<=49)에 딱 맞는 정사각형 마름모 형태이다.

이 때 한칸을 좌표축 위의 한 점으로 볼 수 있는데, 이렇게 되면 중심으로부터 떨어져 있는 거리를 계산해서 마름모 안에 포함되는지, 안되는지를 확인할 수 있다.

 

문제에서의 5*5 크기의 농장은 오른쪽과 같이 좌표로 바꿔서 생각할 수 있고

중심(mid = N/2)에서부터 해당 좌표가 얼마나 떨어져 있는지는 다음의 그림처럼 x좌표 차, y좌표 차의 합으로 생각할 수 있다.

위의 그림에서 mid 값은 2이고

중심에서부터 빨간색 점은 x좌표 차 1, y좌표 차 1로

그 합(2)이 mid보다 작거나 같기 때문에 마름모 안에 포함된다는 것을 알 수 있고

파란색 점은 x좌표 차 2, y좌표 차  2로 

그 합(4)이 mid보다 크기 때문에 마름모 밖에 있다는 것을 알 수 있다.

 

그렇다면 위의 방식을 이용해 해당 좌표가 마름모에 포함된다면 수확을 할 수 있으므로

수익에 포함할 수 있다. 작성한 코드는 다음과 같다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Solution {
     
    static int[][] field = new int[49][49];
    static int size, mid, sum;
     
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
         
        int T = Integer.parseInt(br.readLine());
         
        for(int tc = 1; tc<=T; tc++){
            size = Integer.parseInt(br.readLine());
            mid = size/2;
            sum = 0;
            //입력 받기
            for(int i = 0; i<size;i++) {
                String input = br.readLine();
                for(int j = 0; j<size; j++) {
                    field[i][j] = input.charAt(j)-'0';
                }
            }
            
            //수익 계산
            for(int i = 0; i<size;i++) {
                for(int j = 0; j<size; j++) {
                	//포함여부 확인
                    if((Math.abs(i-mid) + Math.abs(j-mid) <= mid)) {
                        sum += field[i][j];
                    }
                }
            }
             
            sb.append("#").append(tc).append(' ').append(sum).append('\n');
        }
         
        System.out.println(sb);
    }
     
}

'알고리즘' 카테고리의 다른 글

[BOJ 16234/Java]인구 이동  (0) 2023.08.17
[boj2493/Java] 탑  (0) 2023.08.07
[boj21758/Java] 꿀 따기  (0) 2023.07.31
[boj2531, 15961/Java] 회전 초밥  (0) 2023.07.31
[boj3649/Java]로봇 프로젝트  (0) 2023.07.31