https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpoFaAS4DFAUq
1. 서론
배열 가지고 노는 문제에 약한 나한테는 약간 고민스럽게 만들었던 문제. 자바 공부 중이다...
(아니 그리고 어제까지는 Safari로도 잘 되던 것 같은데 이상하게 잘 안돼서 크롬으로 넘어가니까 사이트가 제대로 작동한다... ㅂㄷㅂㄷ)
2. 문제 풀이
배열 두 개가 주어지는데 이를 범위를 자유롭게 움직여서 곱한 뒤에 더한 값의 최댓값을 구하는 문제이다.
문제의 예시처럼 3개, 5개짜리 배열이면
A: 0~2
B: 0~2
A: 0~2
B: 1~3
A: 0~2
B: 2~4
이런 식으로 3가지의 경우의 수가 나오고 이 중에서 가장 큰 값을 구하는 문제인 것이다.
문제를 어떻게 풀어야 하는지는 명확한데 범위를 어떻게 조절할지가 조금 어려웠다. 그냥 i, j 돌린다고 나오는 범위가 아니라서... 그러다가 변수를 하나 만들어서 돌려줬다. 위의 범위에도 나와 있지만 한 칸씩 이동해서 범위를 늘리는 것이기 때문에 한 바퀴 돌 때마다 +1 해주고 배열의 범위가 넘치기 전에 멈추도록 해줬다.
3. 코드 설명
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int t = s.nextInt();
for (int k = 0; k < t; k++) {
int n = s.nextInt();
int m = s.nextInt();
int[] a = new int[n];
int[] b = new int[m];
for (int i = 0; i < n; i++)
a[i] = s.nextInt();
for (int i = 0; i < m; i++)
b[i] = s.nextInt();
int max = 0, x = 0;
if (n < m) {
while(true) {
int sum = 0, j;
for (j = 0; j < n; j++)
sum += a[j] * b[j + x];
max = Math.max(sum, max);
if (j + x < m)
x++;
else
break;
}
}
else {
while(true) {
int sum = 0, j;
for (j = 0; j < m; j++)
sum += a[j + x] * b[j];
max = Math.max(sum, max);
if (j + x < n)
x++;
else
break;
}
}
System.out.println("#" + (k + 1) + " " + max);
}
}
}
길이가 n, m인 배열을 범위별로 곱하는데 이때 각 배열의 길이에 따라서 어느 배열을 기준으로 범위를 이동할지가 정해진다. 당연히 길이가 긴 배열이 범위를 움직여야 하니까 n이 더 길 때, m이 더 길 때로 나눠서 처리해줬다.
자바에서 손을 뗀 지 어언.... 2년? 그래도 모든 것을 까먹진 않았다. (당연함. 4년 동안 배움.)
다만 C 스타일로만 코드를 짜다가 Java 스타일로 짜려니까 약간 어색...
특히 while문 돌릴 때 처음에 1 넣었다가 안돼서 왜 안 되는 거지 하다가 Java는 true만 된다는 고조선적 지식을 뇌 속에서 끄집어내서 고침...
그리고 max 함수 Math.max()인 거 메모...
'Algorithm' 카테고리의 다른 글
[JAVA] SWEA 2001 파리 퇴치 (0) | 2022.07.09 |
---|---|
[JAVA] SWEA 1979 어디에 단어가 들어갈 수 있을까 (0) | 2022.07.07 |
[C++] 프로그래머스 소수 찾기 (0) | 2022.06.18 |
[C++] 프로그래머스 전화번호 목록 (0) | 2022.06.17 |
[C++] 백준 1080 행렬 (0) | 2022.06.10 |