본문 바로가기

코딩테스트 연습/SWEA

[SWEA] 1959. 두 개의 숫자열 D2 (c++)

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

 

SW Expert Academy

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

swexpertacademy.com

 

 

숫자열은 한 뭉치로 한칸씩 이동하므로, 2중 for문으로 쉽게 구현할 수 있었다.

1. n < m인 경우, B를 +j 씩 이동하면서 sum 최댓값 구하기

2. n > m인 경우, A를 +j씩 이동하면서 sum 최댓값 구하기

3. n == m 인경우, 이동시킬 필요 없이 각 자리수 곱 합 구하기

 

 

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 21
int main() {
	int T;
	cin >> T;

	for (int t = 0; t < T; t++) {
		int n, m;
		cin >> n >> m;
		int A[MAX] = { 0, };
		int B[MAX] = { 0, };
		for (int i = 0; i < n; i++)cin >> A[i];
		for (int i = 0; i < m; i++)cin >> B[i];
		int Max = 0;
		int sum = 0;
		//A를 오른쪽으로 한 칸씩 시프트 시키며 최댓값 찾기
		if (n < m) {
			for (int j = 0; j < (m-n)+1; j++) {
				for (int i = 0; i < n; i++) {
					sum += A[i] * B[i+j];
				}
				Max = max(sum, Max);
				sum = 0;
			}
			
		}
		else if(n > m) {
			for (int j = 0; j < (n-m)+1; j++) {
				for (int i = 0; i < m; i++) {
					sum += B[i] * A[i + j];
				}
				Max = max(sum, Max);
				sum = 0;
			}
		}
		else {
			for (int i = 0; i < m; i++) {
				sum += B[i] * A[i];
			}
			Max = max(sum, Max);
			sum = 0;
		}


		cout << "#" << t + 1 << " " << Max << "\n";
	}
	
	return 0;
}