[백준] 4781 사탕 가게 - Java

2024. 4. 19. 10:21· Algorithm/백준 문제풀이
목차
  1. 문제 출저 
  2. 문제 풀이
  3. 소스 코드

 

 

 

문제 출저 

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

 

4781번: 사탕 가게

각 테스트 케이스의 첫째 줄에는 가게에 있는 사탕 종류의 수 n과 상근이가 가지고 있는 돈의 양 m이 주어진다. (1 ≤ n ≤ 5,000, 0.01 ≤ m ≤ 100.00) m은 항상 소수점 둘째자리까지 주어진다. 다음 n개

www.acmicpc.net

 

 

 

문제 풀이

사탕 종류와 상근이가 가진 돈이 주어진다. 사탕은 가격과 칼로리가 있다. 상근이 가진 돈에서 가장 큰 칼로리를 구해야 한다. 사탕은 여러 번 살 수 있다. 

 

냅색 알고리즘을 적용해 풀었습니다. 단 돈이 소수점 둘째 자리로 주어집니다. dp 배열에 길이를 돈이 담당하기 위해 100을 곱해 정수로 만들었습니다. 소수에서 정수로 변환하는 과정에서 rounding error를 해결하기 위해 0.5를 더했습니다. 

 

 

 

소스 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/*
사탕 가게
https://www.acmicpc.net/problem/4781

5000 * 10000 = 500,000,000 5억
시간초 제한 3초 3억



87% 오답
rounding error(부동 소수점 반올림 오차)
Java에서 실수 데이터를 다루다 보면 계산에 오차가 발생하는 경우가 있다.
int를 통한 자동 라운딩을 하면 0.11이 11이 나와야 하지만 10이 나오는 경우이다.
실수를 다룰 때는 rounding error를 주의해야 하며 0.5를 더하는 것으로 해결할 수 있다.

0,5를 도허눈 곳운 아래 값을 반올림하는 가장 간단한 기법이기 때문입니다.
원래 수가 0.5 미만일 때 (예: 2.3) → 0.5를 더하면 2.8이 되고, 정수 변환 시 2로 반올림됩니다.
원래 수가 0.5 이상일 때 (예: 2.7) → 0.5를 더하면 3.2가 되고, 정수 변환 시 3으로 반올림됩니다.
더 정확한 방법으로는 BigDecimal을 사용하는 방법이 있습니다.
 */

public class Main {

    static int n; // 사탕 종류 수
    static int m; // 상근이가 가진 돈의 양
    static StringBuilder sb;
    static int[] dp;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        sb = new StringBuilder();

        while(true) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken());
            float tempM = Float.parseFloat(st.nextToken());

            if (n == 0 && tempM == 0.00) {
                System.out.println(sb);
                return;
            }

            m = (int) (tempM * 100 + 0.5);

            dp = new int[m+1];
            for (int i = 0; i < n; i++) {
                st = new StringTokenizer(br.readLine());
                int calorie = Integer.parseInt(st.nextToken());
                int money = (int) (Float.parseFloat(st.nextToken()) * 100.0 + 0.5);

                for (int j = 0; j <= m; j++) {
                    if (j - money >= 0) dp[j] = Math.max(dp[j], dp[j-money] + calorie);
                }
            }

            sb.append(dp[m]).append("\n");

        }


    }

}
  1. 문제 출저 
  2. 문제 풀이
  3. 소스 코드
'Algorithm/백준 문제풀이' 카테고리의 다른 글
  • [백준] 6144 Charm Bracelet - Java
  • [백준] 18427 함께 블록 쌓기 - Java
  • [백준] 22115 창영이와 커피 - Java
  • [백준] 16493 최대 페이지 수 - Java
너지살
너지살
너지살
너지살개발자
너지살
전체
오늘
어제
  • 분류 전체보기 (375)
    • 잡식 (2)
      • 티스토리 (2)
    • 개발 일지 (0)
      • OMS 프로젝트 (4)
      • 우테코 6기 프리코스 (1)
    • Git (2)
    • JAVA (15)
      • Java 공부 (6)
      • 자료구조 (4)
      • 도움되는 메모 (4)
    • DevOps (18)
      • AWS (6)
      • Docker (2)
      • Jenkins (1)
      • Nginx (1)
      • Kafka (6)
      • RabbitMQ (2)
    • Spring, Spring Boot (16)
      • Test Code (1)
      • AOP (2)
      • Batch (3)
      • Cache - Redis (5)
      • Cloud Config - 설정 파일 관리 (3)
      • 성능 측정 (1)
      • 예외 처리 (1)
    • BackEnd (1)
      • Spring 공부 (1)
      • Thymeleaft (0)
    • DB (17)
      • JPA (2)
      • DB 공부 (3)
      • DB 포스팅 (4)
      • DB 답장 (1)
      • MySQL (2)
      • Redis (5)
      • MongoDB (0)
    • CS (8)
      • Spring (4)
      • DataBase (3)
      • Java (1)
    • Algorithm (203)
      • 알고리즘 개념 (5)
      • 정렬 알고리즘 (11)
      • 프로그래머스 문제풀이 (18)
      • 백준 문제풀이 (165)
      • 소프티어 문제풀이 (3)
      • 알고리즘 시험 정리 (1)
    • SQL (0)
      • 문법 (1)
      • 프로그래머스 문제풀이 (52)
      • 리트코드 문제풀이 (19)
    • IT (1)
      • IT 공부 (1)
    • 정리 (10)
      • 질문 정리 (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 외판원 순회 문제
  • 소프티어
  • two pointer
  • Bitmast
  • 자료구조
  • 병렬 처리
  • 부분탐색
  • Test code
  • 투 포인터
  • dynamiceprogramming
  • 다이나믹 프로그래밍
  • redis
  • 그래프 이론
  • 최소 스패닝 트리
  • Union-Find
  • 질문 정리
  • DFS
  • 그래프 탐색
  • 알고리즘
  • Spring Boot Redis 연결
  • Spring Boot
  • 백준
  • Spring Batch
  • 설정
  • 다이나믹프로그래밍
  • 우선수위큐
  • 두 포인터
  • git
  • 최소 신장 트리
  • docker
  • 분리 집합
  • 크루스칼 알고리즘
  • Next permutation
  • cache
  • DP
  • 유니온파인드
  • JPA
  • dynamic programing
  • Sorting algorithm
  • Algorithm
  • MST
  • 깊이/너비 우선탐색
  • 경로표현식
  • Java
  • 비트마스킹
  • Java 정리
  • 다음 순열 찾기
  • 투포인트
  • db
  • 데이터베이스

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
너지살
[백준] 4781 사탕 가게 - Java
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.