[java]두 개의 숫자열 - SWEA 1959

풀이

문제 해석을 하자면,

  • 마주본 두개의 문자열의 곱의 합이 제일 큰 값을 도출하라


풀이

  • 숫자열은 연속되어 있다.
  • 더 짧은 숫자열이 A라 가정하면, B의 처음부터 끝자리까지 움직이면서 최대값을 구하자
    • 물론, A와 B가 숫자열이 같을수도 있으니 이러한 상황도 전부 고려하자
    • Index만 잘 계산해주면 되는 문제이다.
  • 예상 복잡도는 O(NM)



코드

import java.io.*;
import java.util.*;
public class 두개의숫자열_1959 {
  public static long[] A = new long[22];
  public static long[] B = new long[22];

  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();
    int T = Integer.parseInt(br.readLine());
    for(int t=1; t<=T; t++) {
      //init
      for(int i=0; i<22; i++) {
        A[i] = 0;
        B[i] = 0;
      }
      //input
      StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
      int N = Integer.parseInt(stk.nextToken());
      int M = Integer.parseInt(stk.nextToken());
      stk = new StringTokenizer(br.readLine(), " ");
      for(int i=0; i<N; i++)  A[i]=Integer.parseInt(stk.nextToken());
      stk = new StringTokenizer(br.readLine(), " ");
      for(int i=0; i<M; i++)  B[i]=Integer.parseInt(stk.nextToken());
      //run
      long result = 0;
      if(N<=M) { // N<M 과 N==M
        int copyN = N;
        do { // M-N==0 도 계산위해 do-while 사용
          long temp = 0;
          int diff = M-copyN;
          for(int i=0; i<N; i++) {
            temp += A[i]*B[diff+i]; // calculate
          }
          result = Math.max(result, temp);
          copyN++;
        }while(M-copyN!=-1);
      } else { // N>M
        int copyM = M;
        while(N-copyM!=-1) {
          long temp = 0;
          int diff = N-copyM;
          for(int i=0; i<M; i++) {
            temp += A[diff+i]*B[i]; // calculate
          }
          result = Math.max(result, temp);
          copyM++;
        }
      }
      //output
      sb.append("#"+t+" "+result+"\n");
    }
    System.out.print(sb);
  }
}



느낀점

생략

댓글남기기