[BOJ] 2961: 도영이가 만든 맛있는 음식 (JAVA)

2024. 5. 21. 11:29·Algorithm/완전탐색

문제

https://www.acmicpc.net/problem/2961

 

여담

하나의 재료에 포함된 신맛과 쓴맛인 줄 모르고 각각 나눠서 생각해서 헤맸다. 다행히 반례 예제가 주어져서 틀렸습니다를 마주하지는 않았다. 나름 다 정리하고 풀었는데 또 제대로 읽지 않았나 보다.. 차근차근 고쳐나가야지😢

 

풀이

주어지는 재료의 수가 최대 10개이므로, 완전 탐색을 통해 풀이할 수 있다.

 

각 재료의 신맛과 쓴맛을 배열에 저장한 뒤, 완탐을 수행하면 된다. 풀이 로직은 다음과 같다.

  1. 재료를 적어도 하나 사용했다면 신맛과 쓴맛의 차이가 더 작은 값으로 갱신하기
    • minDiff = Math.min(minDiff, Math.abs(sTaste - bTaste))
  2. 모든 재료를 다 탐색했으면 탐색을 종료하기
  3. 해당 재료를 선택한 경우와 선택하지 않은 경우로 나누어서 재귀 호출하기
    • 해당 재료를 선택한 경우
      • dfs(depth + 1, cnt + 1, sTaste * sTastes[depth], bTaste + bTastes[depth])
    • 해당 재료를 선택하지 않은 경우
      • dfs(depth + 1, cnt, sTaste, bTaste)

 

코드

import java.io.*;
import java.util.*;

public class Main {
    static int n, minDiff = Integer.MAX_VALUE;
    static int[] sTastes, bTastes;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        sTastes = new int[n]; // 신맛
        bTastes = new int[n]; // 쓴맛
        for (int i = 0; i < n; i++) { // 각 재료의 신맛과 쓴맛 정보 저장
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            sTastes[i] = Integer.parseInt(st.nextToken());
            bTastes[i] = Integer.parseInt(st.nextToken());
        }
        dfs(0, 0, 1, 0);
        System.out.println(minDiff);
    }

    static void dfs(int depth, int cnt, int sTaste, int bTaste) {
        if (cnt > 0) { // 재료를 적어도 하나 사용한 경우
            // 신맛과 쓴맛의 차이가 더 작은 값으로 갱신
            minDiff = Math.min(minDiff, Math.abs(sTaste - bTaste));
        }

        if (depth == n) { // 모든 재료를 다 탐색했으면 탐색 종료
            return;
        }
        // 해당 재료 사용 O
        dfs(depth + 1, cnt + 1, sTaste * sTastes[depth], bTaste + bTastes[depth]);
        // 해당 재료 사용 X
        dfs(depth + 1, cnt, sTaste, bTaste);
    }
}

 

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

[BOJ] 14500: 테트로미노 (JAVA)  (1) 2024.09.16
[SWEA] 4193: 수영대회 결승전 (JAVA)  (0) 2024.07.04
[BOJ] 14620: 꽃길 (JAVA)  (0) 2024.05.20
[BOJ] 2615: 오목 (JAVA)  (0) 2024.05.11
[BOJ] 16508: 전공책 (JAVA)  (0) 2024.04.16
'Algorithm/완전탐색' 카테고리의 다른 글
  • [BOJ] 14500: 테트로미노 (JAVA)
  • [SWEA] 4193: 수영대회 결승전 (JAVA)
  • [BOJ] 14620: 꽃길 (JAVA)
  • [BOJ] 2615: 오목 (JAVA)
hjin28
hjin28
  • hjin28
    끄적이는 기록장
    hjin28
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • GitHub
    • 이전 블로그
    • 분류 전체보기
      • TIL
      • Frontend
      • Backend
      • Infra
      • Java
        • 이것이 자바다
      • CS
        • 컴퓨터구조
        • 운영체제
        • 네트워크
        • 데이터베이스
      • Algorithm
        • 자료구조
        • 시뮬레이션
        • 완전탐색
        • BFS & DFS
        • DP
        • 그리디
        • 최단경로
        • 유니온파인드
        • 위상정렬
        • 정렬
        • SQL
      • ETC
  • 최근 글

  • 태그

    컴퓨터구조
    다익스트라
    백트래킹
    ec2
    Programmers
    비트마스킹
    SWEA
    JWT
    백준
    완전탐색
    다이나믹프로그래밍
    Spring
    구현
    자료구조
    그리디
    유니온파인드
    BFS
    DFS
    vue
    최단경로
    SQL
    springsecurity
    덱
    til
    java
    위상정렬
    투포인터
    websocket
    DP
    자바
  • hELLO· Designed By정상우.v4.10.1
hjin28
[BOJ] 2961: 도영이가 만든 맛있는 음식 (JAVA)
상단으로

티스토리툴바