📢 공지합니다
이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
import java.io.*;
import java.util.*;
public class Solution {
static int[][] map;
static int sum;
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int test = 1; test < T + 1; test++) {
N = Integer.parseInt(br.readLine());
sum = 0;
map = new int[N][N];
for (int i = 0; i < N; i++) {
String num = br.readLine();
for (int j = 0; j < num.length(); j++) {
map[i][j] = Integer.parseInt(String.valueOf(num.charAt(j)));
}
}
int front = N / 2 + 1;
int back = N / 2;
farm(front, back);
System.out.println("#" + test + " " + sum);
}
}
public static void farm(int front, int back) {
int fX = 0;
int fY = back;
int bX = 1;
int bY = back;
for (int i = 0; i < front; i++) {
int fnX = fX;
int fnY = fY;
for (int j = 0; j < front; j++) {
sum += map[fnX][fnY];
fnX += 1;
fnY -= 1;
}
fX += 1;
fY += 1;
}
for (int i = 0; i < back; i++) {
int bnX = bX;
int bnY = bY;
for (int j = 0; j < back; j++) {
sum += map[bnX][bnY];
bnX += 1;
bnY -= 1;
}
bX += 1;
bY += 1;
}
}
}
문제를 읽고 여러 가지 방법을 고민한 끝에, 대각선 방향으로 내려가며 합을 구하는 방식으로 문제를 해결했다. 핵심 아이디어는 맨 꼭대기에서 시작해 대각선 왼쪽 아래 방향으로 내려가고, 이후 오른쪽으로 한 칸 이동한 뒤 다시 같은 방식으로 순회하는 것이다. 이 과정을 모두 마치면 front 순회가 끝나며, 이후 back도 같은 방식으로 처리하면 된다. 전체적으로 간단한 알고리즘 문제였다.
[SWEA 1289번] 원재의 메모리 복구하기 (0) | 2025.05.06 |
---|---|
[SWEA 1244번] 최대 상금 (0) | 2025.05.05 |
[SWEA 2817번] 부분 수열의 합 (0) | 2025.05.04 |
[SWEA 1216번] 회문2 (0) | 2025.05.03 |
[SWEA 2806번] N-Queen (0) | 2025.05.01 |