[SWEA 2805] 농작물 수확하기
업데이트:
문제
- SWEA 2805번
- 문제의 저작권은 SW Expert Academy에 있습니다.
접근방식
각 행에서 가운데 열(N/2)을 기준으로 앞 뒤로 +1, -1 하면서 합을 구해주면 되는 문제이다.
행이 N/2인 지점을 기준으로 위, 아래로 나누어 코드를 작성했다.
먼저 0행 ~ N/2행까지는 행만큼 앞,뒤 -1,+1 된다. 그리고 N/2+1행 ~ N행까지는 N/2-1번씩 앞,뒤 -1 +1되며 행이 내려갈수록 N/2-1도 -1을 빼주게 된다. 따라서 이렇게 규칙적으로 변하는 부분을 변수로 지정해서 for문을 돌려주면 풀리는 문제이다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Swea_2805 {
static int T;
static int N;
static int[][] map;
static int[] di = { 0, 0 }; // 좌, 우
static int[] dj = { -1, 1 };
static int Answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; tc++) {
N = Integer.parseInt(br.readLine());
map = new int[N][N];
for (int i = 0; i < N; i++) {
String s = br.readLine();
for (int j = 0; j < N; j++) {
map[i][j] = s.charAt(j) - '0';
}
}
int topSum = 0;
int btmSum = 0;
Answer = 0;
// 0행 ~ N/2행
for (int i = 0; i <= N / 2; i++) { // 행
int x = i, y = N / 2;
topSum += map[x][y]; // 가운데
for (int j = 1; j <= i; j++) { // i번
for (int dir = 0; dir < 2; dir++) { // 앞뒤로 더하고 빼기
int nx = x + di[dir] * j;
int ny = y + dj[dir] * j;
topSum += map[nx][ny];
}
}
}
Answer += topSum;
// N/2+1행 ~ N행
int start = N / 2 - 1;
for (int i = N / 2 + 1; i < N; i++) { // 행
int x = i, y = N / 2;
btmSum += map[x][y]; // 가운데
for (int j = start; j > 0; j--) { // N/2 - 1번
for (int dir = 0; dir < 2; dir++) { // 앞뒤로 더하고 빼기
int nx = x + di[dir] * j;
int ny = y + dj[dir] * j;
btmSum += map[nx][ny];
}
}
start--;
}
Answer += btmSum;
System.out.println("#"+tc+" "+Answer);
}
}
}