ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2805. 농작물 수확하기 - 자바(JAVA)
    알고리즘/SW Expert Academy 2022. 2. 24. 00:01
    728x90

    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;
    	}
    
    }

     

    '알고리즘 > 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

    댓글

Designed by Tistory.