코드굽는 타자기

SWEA[4012] - 요리사 본문

알고리즘/완전탐색

SWEA[4012] - 요리사

bright-jun 2020. 2. 22. 20:47

링크

SWEA[4012]

문제설명

  • N개의 요리재료를 N/2개의 2개의 Subset으로 만든 후 계산.

문제풀이

  • Subset을 Arraylist에 저장

문제코드

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Solution4012 {

    public static int N;
    public static int[][] synergy;
    public static int Ans=Integer.MAX_VALUE;

    public static ArrayList<Integer> sub1 = new ArrayList<Integer>();
    public static ArrayList<Integer> sub2 = new ArrayList<Integer>();

    public static int A;
    public static int B;

    public static void Subset(int cnt, int start) {
        if(cnt==N/2) {
            sub2.clear();
            for (int i = 0; i < N; i++) {
                if(!sub1.contains(i)) {
                    sub2.add(i);
                }
            }
//            System.out.println(sub1);
//            System.out.println(sub2);
//            System.out.println();

            A=0;
            B=0;

            for (int i = 0; i < N/2; i++) {
                for (int j = 0; j < N/2; j++) {
                    A+=synergy[sub1.get(i)][sub1.get(j)];
                    B+=synergy[sub2.get(i)][sub2.get(j)];
                }
            }
            Ans = Math.min(Ans, Math.abs(A-B));

        }
        for (int i = start; i < N; i++) {
            if(!sub1.contains(i)) {
                sub1.add(i);
                Subset(cnt+1, i);
                sub1.remove(new Integer(i));
            }
        }
    }

    public static void main(String[] args) throws IOException {
        System.setIn(new FileInputStream("res/swea/4012.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int T=Integer.parseInt(br.readLine());
        for (int test_case = 1; test_case <= 10; test_case++) {

            N = Integer.parseInt(br.readLine());
            synergy = new int[N][N];
            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < N; j++) {
                    synergy[i][j] = Integer.parseInt(st.nextToken());
                }
            }

            Subset(0,0);


            System.out.println("#"+test_case+" "+Ans);
            /*
             * 초기화
             */
            Ans=Integer.MAX_VALUE;
            sub1.clear();
            sub2.clear();
        }//end test_case
    }//end main
}

아쉬운점

  • Subset만들때 16C8의 경우의 수에서 %2 할 수 있는데 어떻게 할지 모르겠음.
  • 문제 이해를 제대로 못했음
    • 메뉴를 2개씩밖에 선택 못하는게아니라 N/2개씩 아예 반반으로 나누는 것임.
    • 시너지는 synergy[i][j] + synergy[j][i] 하는것임
  • 테케가 10개만 맞은 경우가 있었는데 그 경우는 Test_case for문에 test_case<=10 이었음...

잘한점

  • O(N) = 16C8 = 12870
  • Subset1만들면 Subset2자동으로 만들어지는데 Array로 하려니 번거로워서 Arraylist사용함
    • Arraylist 초기화 안까먹음
  • 조합은 이제 빠르게 짠다. [30분]

'알고리즘 > 완전탐색' 카테고리의 다른 글

Baekjoon[17136] - 색종이붙이기  (0) 2020.02.25
SWEA[2115] - 벌꿀 채취  (0) 2020.02.22
SWEA[4008] - 숫자 만들기  (0) 2020.02.20
SWEA[1247] - 최적 경로  (0) 2020.02.18
SWEA[2806] - N-Queen[D3]  (0) 2020.02.18
Comments