Junior Backend Developer

SEA_5215, 햄버거 다이어트

이번 포스팅에선 SEA 문제 중 하나인 5215번, 햄버거 다이어트를 풀어보고자 한다.


문제 바로가기

햄버거로 다이어트를 하겠다는 괴상한 문제. 출제자가 다이어트 중인데 햄버거가 먹고싶었던 것 같다.
이 문제의 경우 재귀를 얼마나 잘 다루는지에 대한 문제였던 것 같은데, 오후에 공부한 재귀 코드를 그냥 2차원 배열로 바꾼 뒤 만져보니까 풀렸다. 그나마 좀 헤매던 부분은 res 변수(sumN)를 처음에 초기화하지 않아 15분정도 날린 것 같다.

package day3;

import java.util.Scanner;

public class SWEA_5215 {

   static int N;
   static int L;
   static int[][] map;
   static boolean[] v;
   static int res;

   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int TC = sc.nextInt();


      for(int test_case=1; test_case<=TC; test_case++) {


         N = sc.nextInt(); // 재료의 수
         L = sc.nextInt(); // 제한 칼로리
         map = new int[N][2];
         v = new boolean[N];

         // map 생성
         for(int i=0; i<N; i++) {
            for(int j=0; j<2; j++) {
               map[i][j] = sc.nextInt();
            }
         }

         // 입력 확인
//         for(int[] arr : map) {
//            for(int temp : arr) {
//               System.out.print(temp + " ");
//            }
//            System.out.println();
//         }

         // res 초기화 필수
         res = 0;
         dfs(0);
         System.out.println("#" + test_case + " " + res);

      }
   }

   static void dfs(int cnt) {
      // 종료 조건
      if(cnt == N) {
         // 선택된 내용들의 합을 구하여 그 합이 L 이하이면서 가장 높은지 판단
         int sumN = 0;
         int sumL = 0;

         // 만약 간 곳이라면, N과 L을 각각 더해라
         for(int i=0; i<N; i++) {
            if(v[i]) {
               sumN += map[i][0];
               sumL += map[i][1];
            }
         }
         // 만약 지정된 L보다 sumL이 작거나 같다면
         if(sumL <= L) {
            res = Math.max(sumN, res);
         }
         return;
      }

      //실행 및 재귀
      v[cnt] = true;
      dfs(cnt + 1);

      v[cnt] = false;
      dfs(cnt + 1);
   }
}