๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœจ Algorithm

[๋ฐฑ์ค€/C++] 19636๋ฒˆ: ์š”์š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜

by nitronium102 2022. 7. 2.

๋ฌธ์ œ

๋ฐ์‹œ๋Š” D์ผ ๋™์•ˆ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ๋‹ค.

๋‹ค์ด์–ดํŠธ ์ „ ๋ฐ์‹œ์˜ ์ฒด์ค‘์€ W0 g, ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰ I0 Kcal, ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์€ ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰๊ณผ ๊ฐ™์€ I0 Kcal์ด๋‹ค. ๋ฐ์‹œ๋Š” ์šด๋™์„ ํ•˜์ง€ ์•Š์•„ ์ผ์ผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰ A0์€ 0 Kcal์ด๋‹ค.

๋‹ค์ด์–ดํŠธ ๊ธฐ๊ฐ„, ๋ฐ์‹œ๋Š” ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰๊ณผ ์ผ์ผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰์„ ๋ฐ”๊ฟ€ ๊ฒƒ์ด๋‹ค(๋ฌผ๋ก  ๋‹ค์ด์–ดํŠธ ์ „๊ณผ ๊ฐ™์„ ์ˆ˜๋„ ์žˆ๋‹ค). ๋ฐ์‹œ์˜ ๋‹ค์ด์–ดํŠธ ๊ธฐ๊ฐ„ ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰์€ I Kcal, ๋‹ค์ด์–ดํŠธ ๊ธฐ๊ฐ„ ์ผ์ผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰์€ A Kcal์ด๋‹ค.

๋‹ค์ด์–ดํŠธ๋ฅผ ํ•˜๋Š” ๋™์•ˆ ๋ฐ์‹œ์˜ ์ฒด์ค‘๊ณผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์€ ๋ณ€ํ™”ํ•œ๋‹ค. ๋‹จ, ๋ฐ์‹œ์˜ ์‹ ์ฒด ๊ตฌ์กฐ๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•˜์—ฌ ์ฒด์ค‘๊ณผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์€ ๊ฐ๊ฐ ํ•˜๋ฃจ์— ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋ณ€ํ™”ํ•œ๋‹ค.

์ฒด์ค‘์€ (์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰ − ์ผ์ผ ์—๋„ˆ์ง€ ์†Œ๋น„๋Ÿ‰) g/Kcal๋งŒํผ ๋”ํ•ด์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ผ์ผ ์—๋„ˆ์ง€ ์†Œ๋น„๋Ÿ‰์€ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰๊ณผ ์ผ์ผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰์„ ๋”ํ•œ ๊ฐ’์ด๋‹ค.

(์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰ − ์ผ์ผ ์—๋„ˆ์ง€ ์†Œ๋น„๋Ÿ‰) ์˜ ์ ˆ๋Œ“๊ฐ’์ด ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰ ๋ณ€ํ™” ์—ญ์น˜ T Kcal ์ดˆ๊ณผ๋ผ๋ฉด, ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์€ ⌊ (์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰ − ์ผ์ผ ์—๋„ˆ์ง€ ์†Œ๋น„๋Ÿ‰) / 2 ⌋ ๋งŒํผ ๋”ํ•ด์ง„๋‹ค. ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰ ๋ณ€ํ™”๋Š” ๊ฐ™์€ ๋‚ ์˜ ์ฒด์ค‘ ๋ณ€ํ™” ๋‹ค์Œ์— ์ผ์–ด๋‚œ๋‹ค.

๋‹จ, ์•„๋ž˜์— ํ•ด๋‹นํ•˜๋ฉด ๋ฐ์‹œ๋Š” ์‚ฌ๋งํ•œ๋‹ค.

  • ์ฒด์ค‘์ด 0 g ์ดํ•˜์ธ ๊ฒฝ์šฐ
  • ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์ด 0 Kcal ์ดํ•˜์ธ ๊ฒฝ์šฐ

D์ผ ๊ฐ„์˜ ๋‹ค์ด์–ดํŠธ๊ฐ€ ๋๋‚œ ํ›„, ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์˜ ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์™€ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์˜ ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ๊ฐ๊ฐ์˜ ์˜ˆ์ƒ ์ฒด์ค‘๊ณผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์„, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์ด์–ดํŠธ ์ „ ๋ฐ์‹œ์˜ ์›๋ž˜ ์ƒํ™œ๋กœ ๋Œ์•„๊ฐ„๋‹ค๋ฉด ๋ชธ๋ฌด๊ฒŒ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์š”์š” ํ˜„์ƒ์ด ์ผ์–ด๋‚ ์ง€ ๊ณ„์‚ฐํ•ด์ฃผ์ž.

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ฐ์‹œ์˜ ๋‹ค์ด์–ดํŠธ ์ „ ์ฒด์ค‘ W0 (1 ≤ W0 ≤ 107), ๋‹ค์ด์–ดํŠธ ์ „ ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰ ๋ฐ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰ I0 (1≤ I0 ≤ 105), ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰ ๋ณ€ํ™” ์—ญ์น˜ T (1 ≤ T ≤ 1,000)๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ฐ์‹œ์˜ ๋‹ค์ด์–ดํŠธ ๊ธฐ๊ฐ„ D (1 ≤ D ≤ 1,000), ๋‹ค์ด์–ดํŠธ ๊ธฐ๊ฐ„ ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰ I (0 ≤ I ≤ 105), ๋‹ค์ด์–ดํŠธ ๊ธฐ๊ฐ„ ์ผ์ผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰ A (0 ≤ A ≤ 105)๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.

์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๋Š” ์ •์ˆ˜์ด๋ฉฐ, ๋‹จ์œ„๋Š” ์ง€๋ฌธ์—์„œ ์–ธ๊ธ‰ํ•œ ๋‹จ์œ„๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ๋‹ค์ด์–ดํŠธ ๋™์•ˆ ์ฒด์ค‘์ด ์˜คํžˆ๋ ค ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

์ถœ๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์˜ ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋‹ค์ด์–ดํŠธ ํ›„ ์˜ˆ์ƒ ์ฒด์ค‘๊ณผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰ ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋‹ค์ด์–ดํŠธ ์ „ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ ๋‹ค์ด์–ดํŠธ ๋„์ค‘ ๋ฐ์‹œ์˜ ์‚ฌ๋ง์ด ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ ์ฒด์ค‘๊ณผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰ ๋Œ€์‹  Danger Diet๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์˜ ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ์˜ ๋‹ค์ด์–ดํŠธ ํ›„ ์˜ˆ์ƒ ์ฒด์ค‘๊ณผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์„ ์ถœ๋ ฅํ•˜๊ณ , ๋ณ€ํ™”ํ•œ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์„ ๊ฐ€์ง€๊ณ  ๋‹ค์ด์–ดํŠธ ์ „ ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰๊ณผ ๋‹ค์ด์–ดํŠธ ์ „ ์ผ์ผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰์œผ๋กœ ๋Œ์•„๊ฐ”์„ ๋•Œ ์ฒด์ค‘์ด ์ฆ๊ฐ€ํ•˜๋Š” ์š”์š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ YOYO, ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ NO๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹ค์ด์–ดํŠธ ๋„์ค‘ ๋ฐ์‹œ์˜ ์‚ฌ๋ง์ด ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ ์ฒด์ค‘๊ณผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰, ์š”์š” ๋ฐœ์ƒ ์—ฌ๋ถ€ ๋Œ€์‹  Danger Diet๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

๋‹จ์ˆœ ๊ตฌํ˜„์ด๊ธด ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๊ธธ์–ด์„œ ํ—ท๊ฐˆ๋ฆฐ๋‹ค.^^ ๋ฐ์‹œ์•ผ ๊ทธ๋ƒฅ ์•„๋ฌด ์ƒ๊ฐ์—†์ด ์šด๋™ํ•˜๋ฉด์„œ ๋‹ค์ด์–ดํŠธํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฑฐ๋‹ˆ

์ถœ๋ ฅํ•ด์•ผ ํ•  ๊ฒƒ

1) ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰ ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์„ ๋•Œ : ์˜ˆ์ƒ ์ฒด์ค‘๊ณผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰

- ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์ด ๋ณ€ํ™”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฃผ์–ด์ง„ ์ˆ˜์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

int W = W0 + (I - (I0 + A)) * D;

- ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰(I0)์€ 0์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ฃผ์–ด์กŒ์œผ๋‹ˆ ์ฒด์ค‘๋งŒ ํ™•์ธํ•ด์„œ ์‚ฌ๋ง ์—ฌ๋ถ€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

2) ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰ ๋ณ€ํ™”๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ : ์˜ˆ์ƒ ์ฒด์ค‘๊ณผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰

๋‹ค์ด์–ดํŠธ ๊ธฐ๊ฐ„ ๋™์•ˆ ์•„๋ž˜ ๊ณต์‹์„ ์ ์šฉ์‹œ์ผœ์„œ ์ฒด์ค‘์„ ๊ฐ๋Ÿ‰ํ•œ๋‹ค.

์ฒด์ค‘ += ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰(I) - ์ผ์ผ ์—๋„ˆ์ง€ ์†Œ๋น„๋Ÿ‰(O) (O = ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰(I0) + ์ผ์ผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰(A)

์ด๋•Œ ๋ณ€ํ™”๋Ÿ‰์ด ์—ญ์น˜ T๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์„ ๋ณ€ํ™”์‹œ์ผœ์ค€๋‹ค.

if (abs(I-O) > T)
    I0 += floor((double)(I - O)/2);

๋งค์ผ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰๊ณผ ์ฒด์ค‘์„ ํ™•์ธํ•˜์—ฌ ์‚ฌ๋งํ–ˆ์„ ๊ฒฝ์šฐ ๋ฐ”๋กœ ๋ฆฌํ„ดํ•œ๋‹ค. 

if (W0 <= 0 || I0 <= 0)
    return ci(0, 0);

 

3) ์š”์š” ์—ฌ๋ถ€

์š”์š”์˜ ์กฐ๊ฑด : ๋ณ€ํ™”ํ•œ ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์„ ๊ฐ€์ง€๊ณ  ๋‹ค์ด์–ดํŠธ ์ „ ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰(I0)๊ณผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰(0)์œผ๋กœ ๋Œ์•„๊ฐˆ ๊ฒฝ์šฐ ์ฒด์ค‘ ์ฆ๊ฐ€ ์—ฌ๋ถ€๋ฅผ ๋”ฐ์ง€๋ฉด ๋œ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <cmath>
using namespace std;
typedef pair<int, int> ci;

ci diet(int D, int W0, int I, int I0, int T, int A){
    while(D--){
        int O = I0 + A; // ์ผ์ผ ์—๋„ˆ์ง€ ์†Œ๋น„๋Ÿ‰
        W0 += (I - O); // ์ฒด์ค‘

        if (abs(I-O) > T)
            I0 += floor((double)(I - O)/2);

        if (W0 <= 0 || I0 <= 0)
            return ci(0, 0);
    }
    return ci(W0, I0);
}

int main(){

    /*
     * ์ฒด์ค‘ : ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰(I) - ์ผ์ผ ์—๋„ˆ์ง€ ์†Œ๋น„๋Ÿ‰(O) (์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰(I0) + ์ผ์ผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰(A)
     * IF |์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰(I) - ์ผ์ผ ์—๋„ˆ์ง€ ์†Œ๋น„๋Ÿ‰(O)| > T
     * -> ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰(B) += floor(์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰(I) - ์ผ์ผ ์—๋„ˆ์ง€ ์†Œ๋น„๋Ÿ‰(O)/2)
     *
     * ์‚ฌ๋ง ์กฐ๊ฑด : ์ฒด์ค‘(W) <= 0 || ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰(I0) <= 0
     */

    int W0, I0, T, D, I, A;
    cin >> W0 >> I0 >> T; // ๋‹ค์ด์–ดํŠธ ์ „ ์ฒด์ค‘(W0), ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰(I0), ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰(I0), ๊ธฐ์ดˆ๋Œ€์‚ฌ๋Ÿ‰ ์—ญ์น˜(T)
    cin >> D >> I >> A; // ๋‹ค์ด์–ดํŠธ ๊ธฐ๊ฐ„(D), ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰(I), ์ผ์ผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰(A)

    // 1) ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์˜ ๋ณ€ํ™” ๊ณ ๋ ค X
    int W = W0 + (I - (I0 + A)) * D;
    if (W <= 0)
        cout << "Danger Diet\n";
    else
        cout << W << " " << I0 << "\n";

    // 2) ์ผ์ผ ๊ธฐ์ดˆ ๋Œ€์‚ฌ๋Ÿ‰์˜ ๋ณ€ํ™” ๊ณ ๋ ค O
    ci result = diet(D, W0, I, I0, T, A);
    if (result.first <= 0 || result.second <= 0)
        cout << "Danger Diet";

    // 3) ์š”์š” ์—ฌ๋ถ€
    else {
        string ans = "NO";
        // ๋ณ€ํ™”ํ•œ ์ผ์ผ ๋Œ€์‚ฌ๋Ÿ‰์„ ๊ฐ€์ง€๊ณ  ๋‹ค์ด์–ดํŠธ ์ „ ์ผ์ผ ์—๋„ˆ์ง€ ์„ญ์ทจ๋Ÿ‰(I0)๊ณผ ํ™œ๋™ ๋Œ€์‚ฌ๋Ÿ‰(0)์œผ๋กœ ๋Œ์•„๊ฐˆ ๊ฒฝ์šฐ
        if (I0 - result.second > 0)
            ans = "YOYO";
        cout << result.first << " " << result.second << " " << ans << "\n";
    }
}

๋Œ“๊ธ€