[Java] SWEA 2805번: 농작물 수확하기

U·2023년 8월 11일

SWEA

목록 보기
8/10

문제

N X N크기의 농장이 있다.

이 농장에는 이상한 규칙이 있다.

규칙은 다음과 같다.

① 농장은 크기는 항상 홀수이다. (1 X 1, 3 X 3 … 49 X 49)

② 수확은 항상 농장의 크기에 딱 맞는 정사각형 마름모 형태로만 가능하다.

1 X 1크기의 농장에서 자라는 농작물을 수확하여 얻을 수 있는 수익은 3이다.

3 X 3크기의 농장에서 자라는 농작물을 수확하여 얻을 수 있는 수익은 16 (3 + 2 + 5 + 4 + 2)이다.

5 X 5크기의 농장에서 자라는 농작물의 수확하여 얻을 수 있는 수익은 25 (3 + 2 + 1 + 1 + 2 + 5 + 1 + 1 + 3 + 3 + 2 + 1)이다.

농장의 크기 N와 농작물의 가치가 주어질 때, 규칙에 따라 얻을 수 있는 수익은 얼마인지 구하여라.

[제약 사항]

농장의 크기 N은 1 이상 49 이하의 홀수이다. (1 ≤ N ≤ 49)

농작물의 가치는 0~5이다.

[입력]

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

각 테스트 케이스에는 농장의 크기 N과 농장 내 농작물의 가치가 주어진다.

[출력]

각 줄은 '#t'로 시작하고, 공백으로 농장의 규칙에 따라 얻을 수 있는 수익을 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)


일단 생각하기!

  • 마름모에서 위 삼각형, 가운데 줄, 아래 삼각형으로 구역을 나누어 각각의 수익을 더했다.
  • 더 좋은 방법이 있을까?

풀이

package SWEA;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
 * 
 * @author 김유나
 * 2023-08-11
 * [문제] SWEA 2805번 농작물 수확하기
 * - 크기가 항상 홀수인 농장에서 수확은 항상 농자의 크기에 딱 맞는 정사각형 마름모 형태로만 가능할 때, 이때 얻을 수 있는 수익을 구하여라.
 * [아이디어]
 * - 마름모에서 위 삼각형, 가운데 줄, 아래 삼각형으로 구역을 나누어 각각의 수익을 구하여 더한다.
 *
 * 메모리 : 23,312kb 실행 시간 : 140ms
 */
public class D3_2805_농작물수확하기_김유나 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int t = Integer.parseInt(br.readLine()); // 테스트 케이스
		StringTokenizer st;
		
		for (int tc = 1; tc <= t; tc++) {
			int n = Integer.parseInt(br.readLine()); // 농장 크기
			int [][] arr = new int[n][n]; // 농장 배열
			int sum = 0; // 수익 합
			
			// 수익 배열 입력 받기
			for (int i = 0; i < n; i++) {
				String str = br.readLine();
				for (int j = 0; j < n; j++) {
					arr[i][j] = Integer.parseInt(str.substring(j, j + 1));
				}
			}
			
			// 위 삼각형
			for (int i = 0; i < n / 2; i++) {
				for (int j = n / 2 - i; j < n / 2 + 1 + i; j++) {
					sum += arr[i][j];
				}
			}
			
			// 가운데 줄
			for (int i = 0; i < n; i++) {
				sum += arr[n / 2][i];
			}
			
			// 아래 삼각형
			for (int i = n / 2 + 1; i < n; i++) {
				for (int j = i - n / 2; j < 3 * n / 2 - i; j++) {
					sum += arr[i][j];
				}
			}
			
			System.out.println("#" + tc + " " + sum);
		}
	}
}
profile
백엔드 개발자 연습생

0개의 댓글