๋ฌธ์ œ

๋ฐฑ์ค€ 13137๋ฒˆ Exchange Problem

ํ•ด๊ฒฐ ๊ณผ์ •

1. ๋ฌธ์ œ ์ดํ•ด

์ด ๋ฌธ์ œ๋Š” DP์™€ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋จผ์ € DP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ „์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๋ณ‘์ฐฌ์ด์˜ ๋ฐฉ๋ฒ•์ธ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

2. ๋™์ „ ๊ตํ™˜ DP ๊ตฌํ˜„

๋จผ์ € DP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ „์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด์ž. ์—ฌ๋А ๋™์ „ ๊ตํ™˜ ๋ฌธ์ œ์™€ ๊ฐ™์ด, ๋ฅผ ์›์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ๋™์ „์˜ ๊ฐœ์ˆ˜๋ผ๊ณ  ์ •์˜ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ ์ด๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

vector<int> dp(2 * p[n - 1] + 1);
for (int i = 0; i <= 2 * p[n - 1]; ++i) dp[i] = i;
for (int i = 1; i <= 2 * p[n - 1]; ++i) {
  for (int j = 0; j < n; ++j) {
    if (p[j] <= i) dp[i] = min(dp[i], dp[i - p[j]] + 1);
  }
}

3. ๋ณ‘์ฐฌ์ด์˜ ๋ฐฉ๋ฒ• ๊ตฌํ˜„

๋‹ค์Œ์œผ๋กœ ๋ณ‘์ฐฌ์ด์˜ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด๋ณด์ž. ๋ณ‘์ฐฌ์ด์˜ ๋ฐฉ๋ฒ•์€ ๋งค ์ˆœ๊ฐ„๋งˆ๋‹ค, ๋” ํ•„์š”ํ•œ ๋ˆ ์ดํ•˜์˜ ์•ก๋ฉด์„ ๊ฐ€์ง„ ๋™์ „ ์ค‘ ๊ฐ€์žฅ ์•ก๋ฉด์ด ๋†’์€ ๋™์ „์„ ์„ ํƒํ•˜๋Š” ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

int greedy(int i, int n, vector<int>& p) {
  int cnt = 0;
  for (int j = n - 1; j >= 0; --j) {
    cnt += i / p[j];
    i %= p[j];
  }
  return cnt;
}

4. ๋ณ‘์ฐฌ์ด์˜ ๋ฐฉ๋ฒ•๊ณผ DP์˜ ๊ฒฐ๊ณผ ๋น„๊ต

์ด์ œ ๋ถ€ํ„ฐ ๊นŒ์ง€์˜ ๋ชจ๋“  ๊ธˆ์•ก์— ๋Œ€ํ•ด DP๋กœ ์ตœ์†Œ ๋™์ „์„ ๊ณ„์‚ฐํ•˜๊ณ , ์ดํ›„ ๋ณ‘์ฐฌ์ด์˜ ๋ฐฉ๋ฒ•์ธ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ณ‘์ฐฌ์ด์˜ ๋ฐฉ๋ฒ•์ด ์ตœ์ ์ด ์•„๋‹ˆ๋ผ๋Š” ๋œป์ด๋‹ค. ๋”ฐ๋ผ์„œ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ผ์น˜ํ•œ๋‹ค๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

for (int i = 1; i <= 2 * p[n - 1]; ++i) {
  if (greedy(i, n, p) != dp[i]) return false;
}
return true;

์˜ˆ์‹œ ๋‹ต์•ˆ

์œ„์˜ ๊ณผ์ •์„ ์ข…ํ•ฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

C++ ์ฝ”๋“œ

Baekjoon/13xxx/13137.cpp
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
 
int greedy(int i, int n, vector<int>& p) {
  int cnt = 0;
  for (int j = n - 1; j >= 0; --j) {
    cnt += i / p[j];
    i %= p[j];
  }
  return cnt;
}
 
bool solve(void) {
  int n; cin >> n;
  vector<int> p(n);
  for (int i = 0; i < n; ++i) cin >> p[i];
 
  vector<int> dp(2 * p[n - 1] + 1);
  for (int i = 0; i <= 2 * p[n - 1]; ++i) dp[i] = i;
  for (int i = 1; i <= 2 * p[n - 1]; ++i) {
    for (int j = 0; j < n; ++j) {
      if (p[j] <= i) dp[i] = min(dp[i], dp[i - p[j]] + 1);
    }
  }
 
  for (int i = 1; i <= 2 * p[n - 1]; ++i) {
    if (greedy(i, n, p) != dp[i]) return false;
  }
  return true;
}
 
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
 
  cout << (solve() ? "Yes" : "No");
  return 0;
}

ํšจ์œจ์„ฑ ๋ถ„์„

์‹œ๊ฐ„ ๋ณต์žก๋„๊ณต๊ฐ„ ๋ณต์žก๋„

๋ฌธ์ œ ํ’€์ด ํŒ

๋ฌธ์ œ์—์„œ ๋™์ „์˜ ๋‹จ์œ„ ์•ก๋ฉด ๊ฐ’์€ ์ˆœ์ฆ๊ฐ€ ์ˆ˜์—ด์ด๋ผ๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ ์ •๋ ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

DP ์œ ํ˜•์˜ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š”, ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๊ฐ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •๋ณด๋กœ ๋‚˜๋ˆ„์–ด ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด ๋ฌธ์ œ์—์„œ๋Š” ๋ฅผ ์›์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ๋™์ „์˜ ๊ฐœ์ˆ˜๋กœ ์ •์˜ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค ์ˆœ๊ฐ„๋งˆ๋‹ค ์ตœ์ ์˜ ์„ ํƒ์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋งค ์ˆœ๊ฐ„๋งˆ๋‹ค ์ตœ์ ์˜ ์„ ํƒ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด์ž.

์ถ”๊ฐ€ ํ•™์Šต ์ž๋ฃŒ