https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV7GLXqKAWYDFAXB
해당 문제는 일정 범위 안에 포함된 농작물의 양을 구하는 문제로
범위는 농장의 크기(N*N, N은 홀수 & 1<=N<=49)에 딱 맞는 정사각형 마름모 형태이다.
이 때 한칸을 좌표축 위의 한 점으로 볼 수 있는데, 이렇게 되면 중심으로부터 떨어져 있는 거리를 계산해서 마름모 안에 포함되는지, 안되는지를 확인할 수 있다.
문제에서의 5*5 크기의 농장은 오른쪽과 같이 좌표로 바꿔서 생각할 수 있고
중심(mid = N/2)에서부터 해당 좌표가 얼마나 떨어져 있는지는 다음의 그림처럼 x좌표 차, y좌표 차의 합으로 생각할 수 있다.
위의 그림에서 mid 값은 2이고
중심에서부터 빨간색 점은 x좌표 차 1, y좌표 차 1로
그 합(2)이 mid보다 작거나 같기 때문에 마름모 안에 포함된다는 것을 알 수 있고
파란색 점은 x좌표 차 2, y좌표 차 2로
그 합(4)이 mid보다 크기 때문에 마름모 밖에 있다는 것을 알 수 있다.
그렇다면 위의 방식을 이용해 해당 좌표가 마름모에 포함된다면 수확을 할 수 있으므로
수익에 포함할 수 있다. 작성한 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
static int[][] field = new int[49][49];
static int size, mid, sum;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for(int tc = 1; tc<=T; tc++){
size = Integer.parseInt(br.readLine());
mid = size/2;
sum = 0;
//입력 받기
for(int i = 0; i<size;i++) {
String input = br.readLine();
for(int j = 0; j<size; j++) {
field[i][j] = input.charAt(j)-'0';
}
}
//수익 계산
for(int i = 0; i<size;i++) {
for(int j = 0; j<size; j++) {
//포함여부 확인
if((Math.abs(i-mid) + Math.abs(j-mid) <= mid)) {
sum += field[i][j];
}
}
}
sb.append("#").append(tc).append(' ').append(sum).append('\n');
}
System.out.println(sb);
}
}
'알고리즘' 카테고리의 다른 글
[BOJ 16234/Java]인구 이동 (0) | 2023.08.17 |
---|---|
[boj2493/Java] 탑 (0) | 2023.08.07 |
[boj21758/Java] 꿀 따기 (0) | 2023.07.31 |
[boj2531, 15961/Java] 회전 초밥 (0) | 2023.07.31 |
[boj3649/Java]로봇 프로젝트 (0) | 2023.07.31 |