본문 바로가기
알고리즘/SWEA

[SWEA / 두 개의 숫자열 / JAVA]

by KDW999 2023. 5. 2.

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PpoFaAS4DFAUq&categoryId=AV5PpoFaAS4DFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=2 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제 접근

두 배열의 길이에 따라 조건을 걸어서 실행

처음엔 작은 쪽 배열의 인덱스를 통째로 한 칸 씩 움직일려고 생각했는데 그러면 작은 배열의 인덱스를 늘려야해서 작은 배열의 크기가 길어져서 안됐다.

작은 쪽 인덱스는 고정시키고 큰 쪽의 인덱스를 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);

		}
	}
}

댓글