๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€ 3์ฃผ ์ฐจ ํ•™์Šต ์ผ๊ธฐ - 1
ย - Last update: 2023-08-28

๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€๋ž€?

๊ตฌ๋ฆ„ ์ด๋ผ๋Š” ๊ณณ์—์„œ ๋ฌธ์ œ ํ’€์ด ์ฑŒ๋ฆฐ์ง€(๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€)๋ฅผ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ฐธ์—ฌ ์ค‘์ด๋‹ค. ์ด๋ฒคํŠธ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๊พธ์ค€์ด ์˜ฌ๋ผ์˜ค๋ฉฐ, ์ฃผ์— 2ํšŒ์”ฉ (ํ˜น์€ ๊ทธ ์ด์ƒ) ์ฑŒ๋ฆฐ์ง€ ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋“ค์„ ํ’€์ดํ•ด๋ณด๊ณ , ํ›„๊ธฐ๋ฅผ ๋‚จ๊ฒจ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋ฌธ์ œ ํ’€์ด

๊ตฌ๋ฆ„ํ†ค ๋ธ”๋กœ๊น…์ด ์ข€ ๋ฐ€๋ ค ์žˆ์—ˆ๋Š”๋ฐ, ๋งˆ์นจ ํ†ต์ฆ 1 ๋ฌธ์ œ์™€ ํ†ต์ฆ 2 ๋ฌธ์ œ๊ฐ€ ๊ฒฐ์ด ๊ฑฐ์˜ ๊ฐ™์€ ๋ฌธ์ œ์ง€๋งŒ ํ’€์ด๊ฐ€ ๋‹ฌ๋ผ์„œ ํ•œ๋ฒˆ์— ํฌ์ŠคํŒ…ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ†ต์ฆ 1 ํ’€์ด ์ ‘๊ทผ

ํ†ต์ฆ 1์˜ ๊ฒฝ์šฐ์—๋Š”, ๊ฐ ์ˆ˜์น˜๊ฐ€ ๋ฐฐ์ˆ˜ ๊ด€๊ณ„์ด๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ์œ ๋ช…ํ•œ ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ์ฒ˜๋Ÿผ greedy ํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒ๋ฉด, ํฐ ๋™์ „์ด ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋Š” ์–‘์„ ๋” ์ ์€ ์–‘์˜ ๋™์ „์œผ๋กœ๋„ ํ•ญ์ƒ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ๋‹จ์ˆœํ•˜๊ฒŒ ๊ทธ๋ƒฅ ๋‚˜๋จธ์ง€๋งŒ ๊ตฌํ•˜๋ฉด์„œ ๋”ํ•ด๋‚˜๊ฐ€๋ฉด ์ •๋‹ต์ด ๋œ๋‹ค. ๊ตฌ๋ฆ„ํ†ค์˜ ๋ชจ๋ฒ”๋‹ต์•ˆ์„ ๋ณด๋ฉด, ์–ธ์ œ greedy ํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์ •์„์ ์œผ๋กœ ์„œ์ˆ ํ•ด ๋†“์•˜๋Š”๋ฐ, ํ•ด๋‹น ํ•ด์„ค์„ ์ฒจ๋ถ€ํ•œ๋‹ค.

  • ํ˜„์žฌ์˜ ์ตœ์ ์˜ ์„ ํƒ์ด ๋‹ค์Œ ์„ ํƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ˜„์žฌ์˜ ์„ ํƒ์ด ์ตœ์ข… ์„ ํƒ์˜ ์ตœ์  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ํฌํ•จ๋œ๋‹ค.

greedy ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ํ’€์—ˆ๋‹ค๊ณ  ์ข‹์•„ํ•  ๊ฒŒ ์•„๋‹ˆ๋ผ, ์™œ ํ•ด๋‹น ์กฐ๊ฑด์œผ๋กœ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€์— ๋Œ€ํ•ด์„œ ์ฆ๋ช…์ด ์–ด๋ ดํ’‹์ด ๊ฐ€๋Šฅํ•œ ์ •๋„๋กœ ๋˜์–ด์•ผ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ํ’€์—ˆ๋‹ค ํ•  ๊ฒƒ์ด๋‹ค.

๋‚ด ํ’€์ด

N=int(input())
ans=0
while N >= 14:
ans+=N//14
N=N%14
while N >= 7:
ans+=N//7
N=N%7
ans+=N
print(ans)

ํ†ต์ฆ 2 ํ’€์ด ์ ‘๊ทผ

์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ํ†ต์ฆ 1๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋Œ€๋†“๊ณ  ๋‘ ๊ฐ€์ง€์˜ ์•„์ดํ…œ์˜ ํšจ๊ณผ๊ฐ€ ๋ฐฐ์ˆ˜ ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ๋Š” aa๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•˜๊ณ  bb๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹์˜ ์ ‘๊ทผ์€ ์ตœ์ ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.

DP ๋ฌธ์ œ ์ค‘์— ์œ ๋ช…ํ•œ ๋ฐฐ๋‚ญ ์ฑ„์šฐ๊ธฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•ด๋‹น ๋ฌธ์ œ ํ’€์ด์—์„œ ์ƒํƒœ ์ „์ด๋ฅผ ๋ฐฐ๋‚ญ ๋ฌด๊ฒŒ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์ด ๋ฌธ์ œ์—์„œ๋„ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒํƒœ ์ „์ด๋ฅผ ์•ฝ์„ ์‚ฌ์šฉํ•œ ํšŸ์ˆ˜ ๊ธฐ์ค€์ด ์•„๋‹ˆ๋ผ, ํ˜„์žฌ ์‚ฌ์šฉํ•œ ์•„์ดํ…œ์˜ ์šฉ๋Ÿ‰ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ๊น”๋”ํ•œ DP ์‹์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค.

DP[i]=minโก(DP[i],DP[iโˆ’a]+1)DP[i] = \min(DP[i], DP[i - a] + 1)

DP[i]DP[i]๋Š” ii๋งŒํผ์˜ ํ†ต์ฆ์„ ์ •ํ™•ํžˆ ์—†์•จ ์ˆ˜ ์žˆ๋Š” ์•„์ดํ…œ์˜ ์ตœ์†Œ ์‚ฌ์šฉ ๊ฐœ์ˆ˜์ด๋‹ค. ๋ฌธ์ œ ์กฐ๊ฑด์—์„œ Nโ‰ค1,000,000N \leq 1,000,000 ์ด๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ ์ด๊ฒƒ์ด ํ†ต์ฆ ์ˆ˜์น˜ ๊ธฐ์ค€์œผ๋กœ DPDP๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์ผ์ข…์˜ ํžŒํŠธ์ด๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ผ์ข…์˜ DP Signal๋กœ ํŒ๋‹จํ•œ๋‹ค. ์ด NN ๊ฐ’์ด ๋งŒ์•ฝ์— ํ†ต์ฆ 1 ๋ฌธ์ œ์ฒ˜๋Ÿผ Nโ‰ค1,000,000,000N \leq 1,000,000,000 ์ด์—ˆ๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์กฐ๊ฑด์— ๊ฑธ๋ ค์„œ ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ƒ๊ฐํ–ˆ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

์•„๋ฌดํŠผ ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ ์ด์Šˆ๊ฐ€ ์—†๊ณ , ์œ„ ์ •์˜๋œ DPDP ์‹์œผ๋กœ ๋‚ฎ์€ ํšจ๊ณผ ์ˆ˜์น˜์—์„œ ๋†’์€ ํšจ๊ณผ ์ˆ˜์น˜ ์ˆœ์œผ๋กœ ๋ฐฐ์—ด์„ ์ฑ„์›Œ๋‚˜๊ฐ€๋ฉด, ii == NN์—์„œ์˜ ๊ฐ’์ด ์ •๋‹ต์ด ๋œ๋‹ค. base condition์€ DP[0]=0DP[0] = 0 ์ด๋‹ค.

๋‚ด ํ’€์ด

#include <bits/stdc++.h>
using namespace std;
int main() {
int N; scanf("%d", &N);
vector<int> DP(N+1);
constexpr int INF = 987654321;
fill(DP.begin(), DP.end(), INF);
int a, b; scanf("%d %d", &a, &b);
DP[0] = 0;
for(int i = 1; i <= N; ++i) {
if (i - a >= 0) DP[i] = min(DP[i], DP[i - a] + 1);
if (i - b >= 0) DP[i] = min(DP[i], DP[i - b] + 1);
}
if (DP[N] == INF) printf("-1\n");
else printf("%d\n", DP[N]);
return 0;
}
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: