본문 바로가기
알고리즘/SW Expert Academy

[SW Expert Academy / JAVA] 2805.농작물 수확하기

by krapoi 2021. 12. 25.
반응형

이번에 풀어볼 문제는 2805번 농작물 수확하기이다.

 

SW Expert Academy

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

swexpertacademy.com

 

이게 접근하는 방법은 쉬웠는데 코드 짜는데 생각보다 머리가 아파서 힘들었던 문제였다.

아, 힘들진 않았고 짜증 나는 문제.

 

어쨌든 문제부터 보자.

 

문제 설명

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이다.

 

그다음으로 입, 출력이다.

 

입력
 
1
5
14054
44250
02032
51204
52212
 
출력
 
#1 23
 
 
음, 나는 별찍기로 풀기로 했으니 간단하게 풀어보겠다.
코드를 보자
 
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int cnt = sc.nextInt();

        for(int i = 0; i < cnt; i++){
            int size = sc.nextInt();
            sc.nextLine();
            int sum = 0;

            for(int j = size/2; j >= 0; j--){ // 배열 윗부분 계산
                String s = sc.next();
                for(int k = j; k < size - j; k++){
                    sum += s.charAt(k) - '0';
                }
            }

            for(int j = 1; j <= size / 2; j++){ // 배열 아랫부분 계산
                String s = sc.next();
                for(int k = j; k < size - j; k++)
                    sum += s.charAt(k) - '0';
            }

            System.out.println("#" + (i + 1) + " " + sum);

        }
    }

Scanner에 대한 설명은 생략하고,

for문안에 있는 2중 for문 2개가 제일 중요한 for문들인데 하나하나 설명해 주겠다.

 

먼저 for문에 j를 size/2로 했는데 이렇게 하면 우리는 중앙값을 가져오게 된다.

그리고 j가 0이거나 0보다 크다면 (배열은 0번부터 시작이니) 줄여준다.

그 j를 k의 값으로 정해주고, k를 최대 크기의 - j 보다 작다면 더해준다.

size 값을 5, j 값을 2라고 두면

처음 돌 때는 k = 2고 3보다 작으면 k++이니 한 번만 돌 것이다.

그러면 중앙값을 더하게 된다.

그림으로 보자면

 

그림의 빨간 부분만 더하게 되는 것이다.

 

두 번째에는 j 값이 1이 되고,

k 값도 1이 된다, 그리고 k 가 5 - 1보다 작으면 (즉, 4) k++이니 3번 돌게 된다.

이러면 그림으로

이렇게 빨간 부분만 더하게 된다.

이런 식으로 반복하여 문제를 풀면 된다.

 

당연히 아래 for문은 반대로 돌리면 된다.

 

우선 j를 1로 뒀는데 그 이유가

위 for문에서

이 빨간 부분을 더해주기 때문에

나는

이 빨간 부분만 더하기 위해 1부터 시작했다.(0번 인덱스는 딱히 건드릴 필요가 없음)

 

그렇게 시작하여 j가 size / 2 (중앙 인덱스) 보다 작거나 같으면 더해준다. (우리는 for문을 2번 돌여야함)

그다음 k를 j로 정하고 k가 size - j보다 작으면 k++ 이건 위의 for문과 같은 방법이다.

이런 식으로 모두 더해주면 답이 나오게 된다.

반응형