[JAVA] SWEA 1959 두 개의 숫자열
2022. 7. 5.
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpoFaAS4DFAUq 

 

SW Expert Academy

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

swexpertacademy.com

 

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()인 거 메모... 

 

 

 

반응형
myoskin