728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV7GLXqKAWYDFAXB
별표찍기와 비슷한 문제
농장 크기에 딱 들어맞는 다이아몬드 범위안에 있는 숫자의 합 구하기
[입력]
1
5
14054
44250
02032
51204
52212
[출력]
#1 23
[풀이]
농장 가운데행은 농장의 크기와 같고, 그 행을 기준으로 삼각형 2개가 대칭되어있다는 사실을 제일먼저 파악했다.(가운데 열로도 마찬가지!)
농장은 항상 홀수이므로, 농장크기/2 의 몫이 가운데행이 된다.
이를 half변수에 저장해주고, 행이 half보다 작을때(윗삼각형), half(가운데행),half보다 클때(아래삼각형) 총3구간으로 나누어 농작물을 계산하였다.
또한 윗삼각형은 1행 가운데 열을 기준으로 다음행으로 갈수록 왼쪽 시작범위 -1, 오른쪽 끝범위+1 이되는것을 파악하였고, 이는 start변수와 end변수를 두어 한행이 지날때마다 start--, end++로 구현해주었다.
윗삼각형에서는 농작물 계산하고 범위지정(start,end) 했으므로 아래삼각형 계산시 start와end는 가운데행과 일치한다.
때문에 아래삼각형에서는 범위지정먼저 해주고 농작물을 계산해야 함에 주의한다.
import java.util.Scanner;
public class swea2805_farm {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int tc = sc.nextInt();
for (int t = 0; t < tc; t++) {
int size = sc.nextInt();
int[][] arr = new int[size][size];
sc.nextLine();
for (int r = 0; r < size; r++) { //input값 입력
String a = sc.nextLine();
for (int c = 0; c < size; c++) {
arr[r][c] = (a.charAt(c)) - '0'; //char변수 int로 변환
}
}
int half = (size / 2); //가운데 행(가운데 열)
int sum = 0;
int start = half; // 더하는 곳 시작
int end = half; // 더하는 곳 끝
for (int i = 0; i < size; i++) {
if (i < half) { //윗삼각형
for (int j = start; j <= end; j++) {
sum += arr[i][j];
}
start--;
end++;
}
if (i == half) { //가운데행(다 더한다)
for (int j = 0; j < size; j++)
sum += arr[i][j];
}
if (i > half) { //아래삼각형
start++;
end--;
for (int j = start; j <= end; j++) {
sum += arr[i][j];
}
}
}
System.out.printf("#%d %d\n", t + 1, sum);
}
sc.close();
}
}
728x90
'알고리즘 > SWEA' 카테고리의 다른 글
[Java] SWEA5215_ 햄버거다이어트 (1) | 2022.03.17 |
---|---|
[Java] SWEA1218_괄호짝짓기 (0) | 2022.03.16 |
[Java] SWEA1873_상호의배틀필드 (0) | 2022.03.16 |
[Java] SWEA1208_Flatten (0) | 2022.03.16 |
[Java] SWEA2001_파리퇴치 (0) | 2022.03.16 |
댓글