[SWEA 2805번] 농작물 수확하기 with Java

guswls·2024년 5월 15일
0

알고리즘

목록 보기
36/39
post-custom-banner

문제




코드


package main;

import java.util.*;
import java.io.*;

class Main {
	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringBuilder sb = new StringBuilder();
		int T = Integer.parseInt(br.readLine());
		for (int t = 0; t < T; t++) {
			int N = Integer.parseInt(br.readLine()); // 변의 길이

			int[][] arr = new int[N][N];
			for (int i = 0; i < N; i++) {
				String[] input = br.readLine().split("");
				for (int j = 0; j < N; j++) {
					arr[i][j] = Integer.parseInt(input[j]);
				}
			}

			int sum = 0;
			int center = N / 2;
			int start = center;
			int end = center;
			int floor = 0;
			while (floor < N) {
				if (floor <= center) {
					for (int i = start; i <= end; i++) {
						sum += arr[floor][i];
					}
					--start;
					++end;
				} else {
					++start;
					--end;
					for (int i = start + 1; i <= end - 1; i++) {
						sum += arr[floor][i];
					}
				}
				++floor;
			}
			sb.append(String.format("#%d %d\n", t + 1, sum));
		}
		System.out.println(sb);
	}
}


문제 이해


  • 문제 그대로 이해하면 된다.
  • N * N크기의 2차원 배열이 주어졌을 때, 마름모로 영역을 선택해서 그 합을 구하면 된다.


풀이 방법


  • 마름모를 가장 긴 가로 대각선을 기준으로 윗 삼각형, 아래 삼각형 두 부분으로 나눴다.
  • centerN/2값, 즉 정가운데 위치를 의미한다.
  • floor는 행을 의미한다.
  • 최초엔 startendcenter로 초기화하여 진행한다.
  • for문이 진행됨에 따라 startend를 감소시키고 증가시키며 center를 중심으로 늘어나게 하였다.
  • 만약 마름모 윗 삼각형의 영역을 모두 구했다면, 즉 floorcenter보다 더 크다면, 그때부터 start를 증가, end를 감소 시키며 남은 영역을 더한다.


핵심 포인트


  • 처음 딱 봤을 때 어떻게 구해야될 지 방향이 안잡힐 수 도 있는데, 이때 반드시 종이에 그려봐야 된다.
  • 직접 종이에 5 X 5의 배열에서 마름모 영역의 인덱스를 순차적으로 그리다보면 어떻게 구해야될지 바로 감을 잡을 수 있다.


보완할 점 / 느낀 점


  • 엄청난 이해가 필요한 문제는 아니었으나, 마름모로 어떻게 접근할지 약간 고민을 하였다.
  • 사실 수학적인 기믹을 써서 깔끔하게 구할 수 있는 방법을 찾아보았으나, 잘 떠오르지 않아서 그냥 naive하게 구했다.


참고자료


profile
안녕하세요
post-custom-banner

0개의 댓글