이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Baekjoon] 1943: 동전 분배

  • 2023.05.10 14:09
  • Algorithm/PS
글 작성자: SeoArc

문제

돈이 주어지면 반으로 정확히 나눌 수 있는지 묻는 배낭 문제이다.

 

풀이

내 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws IOException {
        for (int i = 0; i < 3; i++) {
            System.out.println(distribute() ? 1 : 0);
        }
    }

    private static boolean distribute() throws IOException {
        int[] coins = new int[100001];

        int n = Integer.parseInt(br.readLine());
        int total = 0;
        for (int i = 1; i <= n; i++) {
            String[] input = br.readLine().split(" ");
            int coin = Integer.parseInt(input[0]);
            int count = Integer.parseInt(input[1]);
            for (int j = 0; j <= count; j++) {
                for (int k = total; k >= 0; k--) { // 이전 기록에 영향이 없도록 반대로 탐색
                    if (k + (coin * j) > 100000) { // 합이 100000원이 넘어가면 종료
                        break;
                    }

                    if (coins[k] > 0) { // 동전을 넣은 적이 있으면 현재 가격과 합을 계산하여 기록
                        coins[k + (coin * j)] += 1;
                    }
                }
            }
            for (int j = 0; j <= count; j++) { // 현재 동전 가격 기록
                coins[coin * j] += 1;
            }
            total += coin * count; // 총계 기록
        }

        if (total % 2 != 0) { // 나눠지지 않으면 바로 false 반환
            return false;
        }

        return coins[total / 2] != 0; // 총 값의 반이 기록되어 있는지 여부 반환
    }
}

이 문제는 전형적인 배낭 문제이다. 때문에 현재 동전 값과 이전에 넣었던 동전들과의 합을 계산하여 기록하는 것이 관건이다.


하지만 0부터 순차전으로 반복하게 되면 현재 반복 타임에서 기록된 동전도 확인하게되어 원하지 않는 결과가 나오게 될 수 있다. 따라서 끝에서부터 반대로 탐색하는 것이 좋다.

 

예를 들어, 100원짜리 동전이 2개 들어와 100, 200을 기록할 때

원래대로라면 100원과 200원만 기록되어야 하는데, 전에 기록된 값이 영향을 받아 300에도 기록되는 상황이 생긴다.

위를 고려하며 탐색을 진행하면서 값이 기록된 적이 있다면 그 값에서 현재 동전 값을 더하여 다시 기록해준다.

 

회고

배낭 문제를 풀어봤었지만 기억이 잘 나지 않아 푸는데 오래 걸렸다. 다시 이 유형을 풀어보는 것이 좋을 것 같다.

저작자표시 (새창열림)

'Algorithm > PS' 카테고리의 다른 글

[Baekjoon] 21611: 마법사 상어와 블리자드  (0) 2023.05.10
[Baekjoon] 2176: 합리적인 이동경로  (0) 2023.05.10
[Baekjoon] 11401: 이항 계수 3  (0) 2023.03.30
[Baekjoon] 1629: 곱셈  (0) 2023.03.21
[Baekjoon] 6064: 카잉 달력  (0) 2023.03.18

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Baekjoon] 21611: 마법사 상어와 블리자드

    [Baekjoon] 21611: 마법사 상어와 블리자드

    2023.05.10
  • [Baekjoon] 2176: 합리적인 이동경로

    [Baekjoon] 2176: 합리적인 이동경로

    2023.05.10
  • [Baekjoon] 11401: 이항 계수 3

    [Baekjoon] 11401: 이항 계수 3

    2023.03.30
  • [Baekjoon] 1629: 곱셈

    [Baekjoon] 1629: 곱셈

    2023.03.21
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (106)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (3)
      • Spring (1)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (2)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • graph
  • java
  • algorithm
  • 알고리즘
  • 자바
  • 네트워크
  • 그래프
  • network

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바