• Home
  • About
    • on Weekend photo

      on Weekend

      ๐™Ž๐™ฉ๐™ช๐™™๐™ฎ๐™ž๐™ฃ๐™œ

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • ํ•„์‚ฌ
  • Projects

[๋ฐฑ์ค€] 2898 (C++)

29 Nov 2020

๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ

์„ค๋ช…

์„คํƒ•์„ ์ •ํ™•ํ•˜๊ฒŒ N ํ‚ฌ๋กœ๊ทธ๋žจ์„ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•˜๊ณ , 3kg๊ณผ 5kg ๋ด‰์ง€๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ ์ตœ๋Œ€ํ•œ ์ ์€ ๊ฐฏ์ˆ˜์˜ ๋ด‰์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ€๋ฉฐ, 3kg์™€ 5kg ๋ด‰์ง€๋กœ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์—†์„ ๋•Œ์—” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜

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

  1. DP[i] = min(DP[i-3]+1, DP[i-5]+1) => ๋‹จ, DP[i-3]๊ณผ DP[i-5]๊ฐ€ -1์ด ์•„๋‹ˆ๋‹ค.
  2. DP[i-3]๊ณผ DP[i-5]๊ฐ€ ๋ชจ๋‘ -1์ธ ๊ฒฝ์šฐ์—๋Š”, DP[i] ์—ญ์‹œ -1๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ฐจ๊ทผ์ฐจ๊ทผ DP[3]๋ถ€ํ„ฐ ๊ตฌํ•˜๋˜, -1๊ฐ€ ์•„๋‹Œ ๊ฐ’๋“ค๋งŒ์„ ์ถ”๋ ค๋ณด๋ฉด
DP[3] = 1
DP[5] = 1
DP[6] = 2 = DP[6-3]+1
DP[8] = 2 = min(DP[8-3]+1, DP[8-5]+1)
DP[9] = 3 = DP[9-3]+1
DP[10] = 2 = DP[10-5]+1
DP[11] = 3 = min(DP[11-5]+1, DP[11-3]+1)
์œ„์ฒ˜๋Ÿผ ์ผ์ •ํ•œ ๊ทœ์น™์„ ๊ฐ–๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

int DP[5001];

int makeN(int sugar)
{
	memset(DP, 0, sizeof(DP));
	DP[3] = DP[5] = 1;
	for (int i = 6; i <= sugar; i++)
	{
		if (DP[i - 3] && DP[i - 5]) DP[i] = min(DP[i - 3] + 1, DP[i - 5] + 1);
		else if (DP[i - 3] && !DP[i - 5]) DP[i] = DP[i - 3]+1;
		else if (!DP[i - 3] && DP[i - 5]) DP[i] = DP[i - 5]+1;
		else DP[i] = 0;
	}
	if (DP[sugar] == 0) DP[sugar] = -1;
	return DP[sugar];
}

int main()
{
	int s;
	cin >> s;
	cout << makeN(s);
}


problem_solvingc++ Share Tweet +1