이번에 풀어볼 문제는 2805번 농작물 수확하기이다.
이게 접근하는 방법은 쉬웠는데 코드 짜는데 생각보다 머리가 아파서 힘들었던 문제였다.
아, 힘들진 않았고 짜증 나는 문제.
어쨌든 문제부터 보자.
문제 설명
N X N크기의 농장이 있다.
이 농장에는 이상한 규칙이 있다.
규칙은 다음과 같다.
① 농장은 크기는 항상 홀수이다. (1 X 1, 3 X 3 … 49 X 49)
② 수확은 항상 농장의 크기에 딱 맞는 정사각형 마름모 형태로만 가능하다.
1 X 1 크기의 농장에서 자라는 농작물을 수확하여 얻을 수 있는 수익은 3이다.
3 X 3 크기의 농장에서 자라는 농작물을 수확하여 얻을 수 있는 수익은 16 (3 + 2 + 5 + 4 + 2)이다.
5 X 5 크기의 농장에서 자라는 농작물의 수확하여 얻을 수 있는 수익은 25 (3 + 2 + 1 + 1 + 2 + 5 + 1 + 1 + 3 + 3 + 2 + 1)이다.
농장의 크기 N와 농작물의 가치가 주어질 때, 규칙에 따라 얻을 수 있는 수익은 얼마인지 구하여라.
아무리 봐도 별 찍기 식으로 풀면 될 것 같다.
그러면 조건을 보러 가자.
제약 사항
농장의 크기 N은 1 이상 49 이하의 홀수이다. (1 ≤ N ≤ 49)
농작물의 가치는 0~5이다.
그다음으로 입, 출력이다.
5
14054
44250
02032
51204
52212
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cnt = sc.nextInt();
for(int i = 0; i < cnt; i++){
int size = sc.nextInt();
sc.nextLine();
int sum = 0;
for(int j = size/2; j >= 0; j--){ // 배열 윗부분 계산
String s = sc.next();
for(int k = j; k < size - j; k++){
sum += s.charAt(k) - '0';
}
}
for(int j = 1; j <= size / 2; j++){ // 배열 아랫부분 계산
String s = sc.next();
for(int k = j; k < size - j; k++)
sum += s.charAt(k) - '0';
}
System.out.println("#" + (i + 1) + " " + sum);
}
}
Scanner에 대한 설명은 생략하고,
for문안에 있는 2중 for문 2개가 제일 중요한 for문들인데 하나하나 설명해 주겠다.
먼저 for문에 j를 size/2로 했는데 이렇게 하면 우리는 중앙값을 가져오게 된다.
그리고 j가 0이거나 0보다 크다면 (배열은 0번부터 시작이니) 줄여준다.
그 j를 k의 값으로 정해주고, k를 최대 크기의 - j 보다 작다면 더해준다.
size 값을 5, j 값을 2라고 두면
처음 돌 때는 k = 2고 3보다 작으면 k++이니 한 번만 돌 것이다.
그러면 중앙값을 더하게 된다.
그림으로 보자면
그림의 빨간 부분만 더하게 되는 것이다.
두 번째에는 j 값이 1이 되고,
k 값도 1이 된다, 그리고 k 가 5 - 1보다 작으면 (즉, 4) k++이니 3번 돌게 된다.
이러면 그림으로
이렇게 빨간 부분만 더하게 된다.
이런 식으로 반복하여 문제를 풀면 된다.
당연히 아래 for문은 반대로 돌리면 된다.
우선 j를 1로 뒀는데 그 이유가
위 for문에서
이 빨간 부분을 더해주기 때문에
나는
이 빨간 부분만 더하기 위해 1부터 시작했다.(0번 인덱스는 딱히 건드릴 필요가 없음)
그렇게 시작하여 j가 size / 2 (중앙 인덱스) 보다 작거나 같으면 더해준다. (우리는 for문을 2번 돌여야함)
그다음 k를 j로 정하고 k가 size - j보다 작으면 k++ 이건 위의 for문과 같은 방법이다.
이런 식으로 모두 더해주면 답이 나오게 된다.
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
[SW Expert Academy / JAVA] 1208.1일차 - Flatten (0) | 2021.12.26 |
---|---|
[SW Expert Academy / JAVA] 2001.파리 퇴치 (2) | 2021.12.24 |
[SW Expert Academy 풀이/JAVA] 1289.원재의 메모리 복구하기 (0) | 2021.12.23 |
[SW Expert Academy 풀이/ JAVA] 1859.백만장자 프로젝트 (0) | 2021.12.22 |