-
2805. 농작물 수확하기 - 자바(JAVA)알고리즘/SW Expert Academy 2022. 2. 24. 00:01반응형
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV7GLXqKAWYDFAXB
문제 해석
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; } }
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
5215. 햄버거 다이어트 (0) 2022.03.03 1940. 가랏! RC카! (0) 2022.02.24 2001. 파리 퇴치 - 자바(JAVA) (0) 2022.02.23 1873. 상호의 배틀필드 - 자바(JAVA) (0) 2022.02.22 1954. 달팽이 숫자 - 자바(JAVA) (0) 2022.02.21