Skip to content

Conversation

wonjunYou
Copy link
Collaborator

@wonjunYou wonjunYou commented Aug 11, 2024

πŸ”— 문제 링크

ν˜Έν…”

문제 μ„€λͺ…

ν˜Έν…”μ˜ 사μž₯인 κΉ€ν˜•νƒμ€ μ΄λ²ˆμ— μˆ˜μž…μ„ 쑰금 늘리기 μœ„ν•΄μ„œ 홍보λ₯Ό ν•˜λ €κ³  ν•œλ‹€.

ν˜•νƒμ΄κ°€ 홍보λ₯Ό ν•  수 μžˆλŠ” λ„μ‹œκ°€ μ£Όμ–΄μ§€κ³ , 각 λ„μ‹œλ³„λ‘œ ν™λ³΄ν•˜λŠ”λ° λ“œλŠ” λΉ„μš©κ³Ό, κ·Έ λ•Œ λͺ‡ λͺ…μ˜ ν˜Έν…” 고객이 λŠ˜μ–΄λ‚˜λŠ”μ§€μ— λŒ€ν•œ 정보가 μžˆλ‹€.
이떄 μ •λ³΄λž€, β€œμ–΄λ–€ λ„μ‹œμ—μ„œ 9원을 λ“€μ—¬μ„œ ν™λ³΄ν•˜λ©΄ 3λͺ…μ˜ 고객이 λŠ˜μ–΄λ‚œλ‹€.”와 같은 정보이닀.

μ΄λŸ¬ν•œ 정보에 λ‚˜νƒ€λ‚Έ 돈의 μ •μˆ˜λ°°(nλ°°) λ§ŒνΌμ„ νˆ¬μžν•  수 μžˆλ‹€. (ex. 18원을 λ“€μ—¬μ„œ 6λͺ…μ˜ 고객)
단, μ •μˆ˜λ°°κ°€ μ•„λ‹Œ 경우 3원을 λ“€μ—¬μ„œ ν™λ³΄ν•΄μ„œ 1λͺ…μ˜ 고객, 12원을 λ“€μ—¬μ„œ 4λͺ…μ˜ 고객을 λŠ˜μ–΄λ‚˜κ²Œ ν•  μˆ˜λŠ” μ—†λ‹€.

μ΄λ•Œ, ν˜Έν…”μ˜ 고객을 적어도 Cλͺ… 늘이기 μœ„ν•΄ ν˜•νƒμ΄κ°€ νˆ¬μžν•΄μ•Ό ν•˜λŠ” 돈의 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λΌ.

첫째 쀄에 C와 ν˜•νƒμ΄κ°€ 홍보할 수 μžˆλŠ” λ„μ‹œμ˜ 개수 N이 μ£Όμ–΄μ§„λ‹€. CλŠ” 1,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , N은 20보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 λ„μ‹œμ—μ„œ 홍보할 λ•Œ λŒ€λŠ” λΉ„μš©κ³Ό κ·Έ λΉ„μš©μœΌλ‘œ 얻을 수 μžˆλŠ” 고객의 μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 이 값은 100보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

40λΆ„

✨ μˆ˜λ„ μ½”λ“œ

μš°μ„  ν•΄λ‹Ή λ¬Έμ œλŠ” μ „ν˜•μ μΈ DP처럼 λ³΄μ΄μ§€λ§Œ, μ•„λž˜ 쑰건에 μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  1. μ •μˆ˜λ°°λ‘œ λˆμ„ νˆ¬μžν•  수 μžˆλ‹€λŠ” 쑰건
  2. Cλͺ…이 μ•„λ‹ˆλΌ, μ΅œμ†Œ Cλͺ…μ˜ 고객을 늘리기 μœ„ν•œ μ΅œμ†Œ λΉ„μš©μ„ ꡬ해야 ν•œλ‹€λŠ” 쑰건

�즉 dp ν…Œμ΄λΈ”μ—μ„œ 고객의 μˆ˜κ°€ 더 λ§Žμ§€λ§Œ, λ°˜λŒ€λ‘œ λΉ„μš©μ΄ 더 적은 κ²½μš°κ°€ μ‘΄μž¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
문제 μ‘°κ±΄μ—μ„œ ν•œ 번의 ν™λ³΄λ‘œ μ΅œλŒ€ 100λͺ…μ˜ 고객을 λͺ¨μ„ 수 μžˆμœΌλ―€λ‘œ, dp ν…Œμ΄λΈ”μ˜ μ΅œλŒ€ λ²”μœ„λ₯Ό c + 100 으둜 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
μ΅œμ†Œ λΉ„μš©μ„ ꡬ해야 ν•˜λ―€λ‘œ, μ •μˆ˜ μ΅œλŒ“κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  int[] dp = new int[c + 100];
  Arrays.fill(dp, Integer.MAX_VALUE);

이어 DP 점화식을 λ‹€μŒκ³Ό 같이 κ΅¬ν–ˆμŠ΅λ‹ˆλ‹€.

  dp[j] = Math.min(dp[j], cost + dp[j - customer]);

ν•˜μ§€λ§Œ, μ΄λŸ¬ν•œ 경우 dp[j - customer]κ°€ Integer.MAX_VALUEμ—¬μ„œ 음수 값이 λ˜μ–΄ ν•΄λ‹Ή 점화식이 λ¬΄ν•œ 루프가 생길 수 μžˆμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ, ν•΄λ‹Ή 쑰건에 λŒ€ν•œ 처리λ₯Ό μΆ”κ°€ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€ !!

  if (dp[j - customer] != Integer.MAX_VALUE)
      dp[j] = Math.min(dp[j], cost + dp[j - customer]);

전체 μ½”λ“œ

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

public class Main {

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int c = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());

        int[] dp = new int[c + 100];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int cost = Integer.parseInt(st.nextToken());
            int customer = Integer.parseInt(st.nextToken());

            for (int j = customer; j < c + 100; j++) {
                if (dp[j - customer] != Integer.MAX_VALUE)
                    dp[j] = Math.min(dp[j], cost + dp[j - customer]);
            }
        }

        int answer = Integer.MAX_VALUE;
        for (int i = c; i < c + 100; i++) {
            answer = Math.min(answer, dp[i]);
        }
        System.out.println(answer);
    }
}

@LJEDD2
Copy link
Collaborator

LJEDD2 commented Oct 27, 2024

μ΅œμ†Œ Cλͺ…κ³Ό μ •μˆ˜λ°° νˆ¬μžκ°€ κ°€λŠ₯ν•˜λ‹€λŠ” 지문을 μ°Ύμ•„μ„œ 문제λ₯Ό ν‘Έμ‹ κ²Œ 정말 λŒ€λ‹¨ν•©λ‹ˆλ‹€ .. ! μ €λŠ” 아직 λ¬Έμ œκ°€ μ–΄λ ΅λ„€μš” T.T

점화식 뢀뢄이 이해가 잘 μ•ˆλ˜μ–΄μ„œ μ˜ˆμ‹œλ₯Ό μ°Ύμ•„κ°€λ©΄μ„œ 직접 ν•œλ²ˆ κ³ λ―Όν•΄λ³Ό 수 μžˆμ—ˆλ˜ 쒋은 λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€ !

C = 12 (λͺ©ν‘œ 고객 수)
λ„μ‹œ1: 3원 -> 5λͺ…
λ„μ‹œ2: 1원 -> 1λͺ…

  1. λ„μ‹œ1 (3원 -> 5λͺ…)
    dp[5] = 3 (3μ›μœΌλ‘œ 5λͺ…)
    dp[10] = 6 (6μ›μœΌλ‘œ 10λͺ…)
    dp[15] = 9 (9μ›μœΌλ‘œ 15λͺ…)
    ...

  2. λ„μ‹œ2 (1원 -> 1λͺ…)
    dp[1] = 1 (1μ›μœΌλ‘œ 1λͺ…)
    dp[2] = 2 (2μ›μœΌλ‘œ 2λͺ…)
    dp[6] = 4 (3μ›μœΌλ‘œ 5λͺ… + 1μ›μœΌλ‘œ 1λͺ… = 4μ›μœΌλ‘œ 6λͺ…)
    ...

μ΄λ ‡κ²Œ 각 λ„μ‹œμ˜ λΉ„μš©κ³Ό 고객 수λ₯Ό λΉ„κ΅ν•˜λ©° Cλͺ… μ΄μƒμ˜ λͺ¨λ“  경우 μ€‘μ—μ„œ μ΅œμ†Œ λΉ„μš©μ„ μ°Ύκ³ 
κ³„μ†ν•΄μ„œ μ΅œμ†Œ λΉ„μš©μ„ κ°±μ‹ ν•΄λ‚˜κ°„λ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€ !

Copy link
Member

@jung0115 jung0115 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μžμ„Έν•œ μ„€λͺ… 덕뢄에 점화식을 κ΅¬ν•˜λŠ” 과정을 이해할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€!

그리고 Integer.MAX_VALUE + costλ₯Ό 해버리면 int λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κΈ° λ•Œλ¬Έμ— μŒμˆ˜κ°€ λ˜μ–΄μ„œ minκ°’μœΌλ‘œ μΈμ‹λ˜κΈ° λ•Œλ¬Έμ— if (dp[j - customer] != Integer.MAX_VALUE) 쑰건을 μΆ”κ°€ν•˜μ‹  뢀뢄은 μ²˜μŒμ— κ³ λ €λ₯Ό λͺ»ν–ˆλŠ”λ°,
λ‹€λ₯Έ 문제λ₯Ό 풀이할 λ•Œλ„ 이런 뢀뢄듀을 λ‘λ²ˆμ„Έλ²ˆ μ²΄ν¬ν•˜λ©΄μ„œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όκ² λ‹€λŠ” 생각을 ν–ˆμŠ΅λ‹ˆλ‹€ πŸ₯Ή

Copy link
Member

@janghw0126 janghw0126 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 DP둜 μ ‘κ·Όν–ˆμ—ˆλŠ”λ° λ§‰νžˆλŠ” 뢀뢄듀이 μžˆμ–΄μ„œ μ›μ€€λ‹˜μ˜ μˆ˜λ„μ½”λ“œλ₯Ό λ³΄λ‹ˆ μ£Όμ˜ν•΄μ•Ό ν•  쑰건듀이 μžˆμ—ˆκ΅°μš”!
덕뢄에 ν•΄κ²° 쑰건듀을 κ³ λ €ν•˜μ—¬ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•΄λ³Ό 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€πŸ˜Š

required_customers, num_cities = map(int, input().split())
city_costs = []

for _ in range(num_cities):
    cost, customers = map(int, input().split())
    city_costs.append((cost, customers))

max_customers = required_customers + 100
min_cost_to_achieve = [float('inf')] * max_customers
min_cost_to_achieve[0] = 0

for cost, customers in city_costs:
    for target in range(customers, max_customers):
        min_cost_to_achieve[target] = min(min_cost_to_achieve[target], min_cost_to_achieve[target - customers] + cost)

print(min(min_cost_to_achieve[required_customers:]))

이번 PR도 μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€πŸ‘

@wonjunYou wonjunYou merged commit bab41cc into main Oct 31, 2024
1 check passed
@wonjunYou wonjunYou deleted the 6-wonjunYou branch October 31, 2024 07:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants