코드
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차원 배열이 주어졌을 때, 마름모로 영역을 선택해서 그 합을 구하면 된다.
풀이 방법
- 마름모를 가장 긴 가로 대각선을 기준으로
윗 삼각형
, 아래 삼각형
두 부분으로 나눴다.
center
는 N/2
값, 즉 정가운데 위치를 의미한다.
floor
는 행을 의미한다.
- 최초엔
start
와 end
를 center
로 초기화하여 진행한다.
- for문이 진행됨에 따라
start
와 end
를 감소시키고 증가시키며 center
를 중심으로 늘어나게 하였다.
- 만약 마름모 윗 삼각형의 영역을 모두 구했다면, 즉
floor
가 center
보다 더 크다면, 그때부터 start
를 증가, end
를 감소 시키며 남은 영역을 더한다.
핵심 포인트
- 처음 딱 봤을 때 어떻게 구해야될 지 방향이 안잡힐 수 도 있는데, 이때 반드시 종이에 그려봐야 된다.
- 직접 종이에
5 X 5
의 배열에서 마름모 영역의 인덱스를 순차적으로 그리다보면 어떻게 구해야될지 바로 감을 잡을 수 있다.
보완할 점 / 느낀 점
- 엄청난 이해가 필요한 문제는 아니었으나, 마름모로 어떻게 접근할지 약간 고민을 하였다.
- 사실 수학적인 기믹을 써서 깔끔하게 구할 수 있는 방법을 찾아보았으나, 잘 떠오르지 않아서 그냥
naive
하게 구했다.
참고자료