2805. 농작물 수확하기 - 자바(JAVA)
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;
}
}