문제 접근
두 배열의 길이에 따라 조건을 걸어서 실행
처음엔 작은 쪽 배열의 인덱스를 통째로 한 칸 씩 움직일려고 생각했는데 그러면 작은 배열의 인덱스를 늘려야해서 작은 배열의 크기가 길어져서 안됐다.
작은 쪽 인덱스는 고정시키고 큰 쪽의 인덱스를 1씩 증가시키면서 비교해가기로 했다.
++ 풀고나서 보니
if(sum > maxSum) 대신 Math.max()를 써도 되고, 두 배열의 크기가 같을 경우는 else로 따로 안빼도 되더라 한 쪽에서 크거나 같다를 조건을 걸어주면 딱 한 번 실행하고 끝날테니까
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for(int t=1; t<=T; t++) {
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] A = new int[N];
int[] B = new int[M];
st = new StringTokenizer(br.readLine()); // A배열 값
for(int n=0; n<N; n++) A[n] = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine()); // B배열 값
for(int m=0; m<M; m++) B[m] = Integer.parseInt(st.nextToken());
int sum = 0;
int maxSum = 0;
if(A.length < B.length) { // A 배열이 더 길 때
int diff = B.length - A.length;
for(int i=0; i<=diff; i++) {
for(int j=0; j<N; j++) sum += A[j] * B[j+i];
if(sum > maxSum) maxSum = sum;
sum = 0; // 한 단위의 합 초기화
}
}
else if(A.length > B.length) { // B 배열이 더 길 때
int diff = A.length - B.length;
for(int i=0; i<=diff; i++) {
for(int j=0; j<M; j++) sum += B[j] * A[j+i];
if(sum > maxSum) maxSum = sum;
sum = 0;
}
}
else { // 둘이 같을 때
for(int i=0; i<N; i++) maxSum += A[i] * B[i];
}
System.out.println("#"+t+" "+ maxSum);
}
}
}
다른 사람 풀이
배열의 크기에 따른 조건을 단 하나만 걸고 조건에 걸리면 기존에 있는 A배열과 B배열의 위치를 바꾸어주었다.
Math.abs() → 인자를 절대값으로 변경
import java.util.Scanner;
// 두 개의 숫자열
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int N, M, max, tempSum;
int[] A, B;
for (int t = 1; t <= T; t++) {
max = 0;
N = sc.nextInt(); M = sc.nextInt();
A = new int[N]; B = new int[M];
for (int i = 0; i < N; i++) {
A[i] = sc.nextInt();
}
for (int i = 0; i < M; i++) {
B[i] = sc.nextInt();
}
if (N > M) {
int temp = N; N = M; M = temp;
int[] tempArr = A; A = B; B = tempArr;
}
for (int i = 0; i <= Math.abs(M - N); i++) {
tempSum = 0;
for (int j = 0; j < N; j++) {
tempSum += A[j] * B[i + j];
}
if (max < tempSum) {
max = tempSum;
}
}
System.out.printf("#%d %d\n", t, max);
}
}
}
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA / 간단한 소인수분해 / JAVA] (0) | 2023.05.04 |
---|---|
[SWEA / 날짜 계산기 / JAVA] (1) | 2023.05.03 |
[SWEA / 숫자 배열 회전 / JAVA] (0) | 2023.05.01 |
[SWEA / 수도 요금 경쟁 / JAVA] (0) | 2023.05.01 |
[SWEA / 숫자를 정렬하자 / JAVA] (0) | 2023.04.29 |
댓글