Blog

B 9465

package org.example;  
  
import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.ArrayList;  
import java.util.StringTokenizer;  
  
public class Main {  
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
    static ArrayList<Integer> sticker;  
    static boolean[] visited;  
    static int n, sum, max;  
  
    public static void main(String[] args) throws IOException {  
        int T = Integer.parseInt(br.readLine());  
  
        for (int i = 0; i < T; i++) {  
            n = Integer.parseInt(br.readLine());  
  
            // 2번째 행은 n ~ 2n-1            sticker = new ArrayList<>();  
  
            for (int j = 0; j < 2; j++) {  
                StringTokenizer st = new StringTokenizer(br.readLine());  
                for (int k = 0; k < n; k++) {  
                    sticker.add(Integer.parseInt(st.nextToken()));  
                }  
            }  
  
            // 조합  
            visited = new boolean[sticker.size()];  
            max = 0;  
            combination(0, sticker.size(), n);  
  
            System.out.println(max);  
        }  
    }  
  
    private static void combination(int start, int arrSize, int r) {  
        if(r == 0) {  
            return;  
        }  
  
        for(int i = start; i < arrSize; i++) {  
            if (!visited[i]) {  
                visited[i] = true;  
                sum += sticker.get(i);  
  
                // 가장 왼쪽 열이 아닐 경우  
                if (i != 0 && i != n) {  
                    visited[i - 1] = true;  
                }  
  
                // 가장 오른쪽 열이 아닐 경우  
                if (i != n - 1 && i != (2 * n) - 1) {  
                    visited[i + 1] = true;  
                }  
  
                // 1행이면 아래칸 방문표시  
                if (i < n) {  
                    visited[i + n] = true;  
                }  
                combination(i + 1, arrSize, r - 1);  
            } else { // 방문 안했을 경우 r 그대로  
                combination(i + 1, arrSize, r);  
            }  
            visited[i] = false;  
            max = Math.max(max, sum);  
            sum = 0;  
        }  
    }  
  
    /*  
    * 5    * 50 10 100 20 40    * 30 50 70 10 60    * 50 100 50 60 -> 260    * 무조건 가장 많은 스티커를 붙히는 것이 최고 점수는 아님  
    private static void findMax() {        int max = 0;  
        for (int i = 0; i < 2; i++) {            visited = new boolean[sticker.size()];            int sum = 0;  
            for (int j = i; j < 2 * n; j++) {                if (visited[j]) {                    continue;                }                visited[j] = true;                sum += sticker.get(j);  
                // 가장 왼쪽 열이 아닐 경우  
                if (j != 0 && j != n) {                    visited[j - 1] = true;                }  
                // 가장 오른쪽 열이 아닐 경우  
                if (j != n - 1 && j != (2 * n) - 1) {                    visited[j + 1] = true;                }  
                // 1행이면 아래칸 방문표시  
                if (j < n) {                    visited[j + n] = true;                }            }  
            max = Math.max(sum, max);  
            System.out.println("sum : " + sum);        }        System.out.println(max);    }     */}