알고리즘/SW Expert Academy

2805. 농작물 수확하기 - 자바(JAVA)

Junuuu 2022. 2. 24. 00:01
반응형

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

 

SW Expert Academy

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

swexpertacademy.com

문제 해석

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

농장에는 규칙이 존재한다.

1. 농장의 크기는 항상 홀수이다.

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

 

 

입력

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

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

 

제약조건

농장의 크기 1 <= N <= 49 사이의 홀수

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

출력

각 줄은 '#t'로 시작하고, 공백으로 농장의 규칙에 따라 얻을 수 있는 수익을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 

문제 풀이 전 설계

1 x 1 일 때는 특수상황으로 제외하고

계산에 제외해야 하는 수가

3 x 3는 1개, 0개, 1개

5 x 5는 2개, 1개, 0개, 1개, 2개

이런 식으로 특정값부터 시작하여 0까지 줄어들고 다시 증가하는 형태를 가집니다.

이를 수학적으로 구현하기 위해서는 절댓값이 도입되어야 한다고 생각합니다.

 

3 x 3의 경우는 | X - 1 | 의 식을 대입하면 row 0 ,1 ,2를 반복할 때 column에 대하여 1,0,1번을 계산에 제외할 수 있습니다.

5 x 5의 경우는 | X - 2 | 의 식을 대입하면 row 0, 1, 2, 3, 4를 반복할 때 column에 대하여 2, 1, 0, 1, 2번의 계산을 제외할 수 있습니다.

 

7 x 7 의경우는 어떨까요?

| X - 3 | 의 식을 대입하면 됩니다.

이를 통해 뒤에 (-숫자)는

3일 때 1

5일 때 2

7일 때 3

이므로 이를 통해 규칙성을 찾으면 [숫자 = (N/2)] 인 것을 알 수 있습니다.

 

이를 통해 반복문을 구현해 보겠습니다.

 

코드

package day0204;

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

public class HarvestingCrops {
	static int[][] farmBoard;
	static BufferedReader br;
	static int N;

	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++) {
			inputFarmBoardInfo();
			// inputFarmBoardInfoTest();

			if (N == 1) {
				System.out.println("#" + t + " " + farmBoard[0][0]);
				continue;
			}
			int sum = getFarmBoardSum();
			System.out.println("#" + t + " " + sum);
		}

	}

	static void inputFarmBoardInfo() throws IOException {
		N = Integer.parseInt(br.readLine());
		farmBoard = new int[N][N];

		for (int i = 0; i < N; i++) {
			String str = br.readLine();
			for (int j = 0; j < N; j++) {
				farmBoard[i][j] = str.charAt(j) - '0';
			}
		}
	}

	static void inputFarmBoardInfoTest() {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				System.out.print(farmBoard[i][j] + " ");
			}
			System.out.println();
		}
	}

	private static int getFarmBoardSum() {
		int k = 1;
		boolean kFlag = true;
		int sum = 0;

		for (int i = 0; i < N; i++) {
			int temp = Math.abs(i - (N / 2));
			for (int j = temp; j < temp + k; j++) {
				sum += farmBoard[i][j];
			}

			// k가 N이 되기전까지는 k = k + 2
			// k가 N에 도달한이후부터는 k = k - 2
			if (kFlag) {
				k = k + 2;
			} else {
				k = k - 2;
			}

			if (k == N) {
				kFlag = false;
			}
		}
		return sum;
	}

}