[BaekJoon 2292][๐ŸŸค2] ๋ฒŒ์ง‘

Date :   Updated :

โ“ ๋ฌธ์ œ

๋ฐฑ์ค€ 2292 - โ€œ๋ฒŒ์ง‘โ€

๐ŸŽฏ ๋‚œ์ด๋„

Bronze ๐ŸŸค2

๐Ÿง  ํ’€์ด

1. ๋‚ด ํ’€์ด (๊ทœ์น™ ์ฐพ๊ธฐ)

- ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Mathematics

- ์„ค๋ช…

ํŠน์ • ๊ทœ์น™์„ ์ฐพ์•„๋‚ด์–ด ๊ทธ ๊ทœ์น™์— ๋”ฐ๋ผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ ๋‹ต์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์—ˆ๋‹ค.

๋ฐฉ ํ•˜๋‚˜๊ฐ€ ์œก๊ฐํ˜• ๋ชจ์–‘์— ์‹œ๊ณ„ ๋ฐฉํ–ฅ์„ ๋Œ๋ฉฐ ๋ฐฉ์ด ํ•˜๋‚˜์”ฉ ๋Š˜์–ด๋‚˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. BFS๋„ ์ƒ๊ฐํ•ด ๋ดค์ง€๋งŒ ๋„ˆ๋ฌด ๋ณต์žกํ•  ๊ฒƒ ๊ฐ™์•˜๊ณ , ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹๋„ ํž˜๋“ค์–ด ๋ณด์—ฌ์„œ ๊ฒฐ๊ตญ์€ ์–ด๋– ํ•œ ๊ทœ์น™์„ ์ฐพ๋Š”๊ฒŒ ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

๊ทœ์น™์€ ์ƒ๊ฐ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๋‹ค.

๋ฐ”๊นฅ ๋ ˆ์ด์–ด๊ฐ€ ํ•œ ๊ฒน ๋Š˜์–ด๋‚  ๋•Œ๋งˆ๋‹ค ๋Š˜์–ด๊ฐ€๋Š” ๋ฐฉ์˜ ๊ฐฏ์ˆ˜๊ฐ€ 6๊ฐœ๊ฐ€ ๋” ์ƒ๊ธด๋‹ค.

์ฆ‰, ๊ฐ๊ฐ์˜ ๋ ˆ์ด์–ด์˜ ๋ฐฉ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. 1 ๋ ˆ์ด์–ด : 1๊ฐœ (1)
  2. 2 ๋ ˆ์ด์–ด : 7๊ฐœ (1 + 6)
  3. 3 ๋ ˆ์ด์–ด : 19๊ฐœ (7 + 12)
  4. 4 ๋ ˆ์ด์–ด : 37๊ฐœ (19 + 18)

๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ๊ฐ ๋ ˆ์ด์–ด์˜ ๊ฐ€์žฅ ๋†’์€ ์ˆซ์ž์˜ ๋ฐฉ์„ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๊ทœ์น™์— ๋”ฐ๋ผ ์ฐพ์œผ๋ ค๋Š” ๋ฐฉ์˜ ์ˆซ์ž๊ฐ€ ์–ด๋–ค ๋ฒ”์œ„์˜ ๋ ˆ์ด์–ด์— ์†ํ•˜๋Š”์ง€๋งŒ ์•Œ์•„๋‚ด๋ฉด ๋‹ต์ด ๋‚˜์˜จ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(โˆšN)์ธ๋ฐ ๊ฐ๊ฐ์˜ ๋ ˆ์ด์–ด์˜ ์ˆ˜๋งŒํผ๋งŒ ๋ฐ˜๋ณต์„ ๋Œ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋œ๋‹ค๋ฉด ์ถ”๊ฐ€ ํ’€์ด 1 ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

- ์ฝ”๋“œ

๋‚ด ํ’€์ด ์ฝ”๋“œ
#include <iostream>


using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int iN{};
    cin >> iN;

    int iEnd{ 1 };
    int iCnt{ 1 };

    while(iEnd < iN)    // ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ
    {
        iEnd += 6 * iCnt;
        ++iCnt;
    }

    cout << iCnt;

    return 0;
}

2. ์ถ”๊ฐ€ ํ’€์ด (๊ทœ์น™ + ์ˆ˜์‹ํ™”)

- ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • Mathematics

- ์„ค๋ช…

์œ„์˜ ๊ทœ์น™์„ '์ˆ˜์‹'์œผ๋กœ '๊ณต์‹ํ™”'ํ•ด ๋ฐ”๋กœ ๋‹ต์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•˜๋Š” ํ’€์ด์ด๋‹ค.

๊ทœ์น™์„ ๊ณต์‹ํ™”ํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • n๋ฒˆ์งธ ๋ ˆ์ด์–ด๊นŒ์ง€์˜ ๋ˆ„์  ๋ฐฉ ๊ฐœ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

\[ end(n) = 6(1 + 2 + 3 + 4 + \cdots + (n - 1)) \]

  • ๋“ฑ์ฐจ์ˆ˜์—ด์˜ ํ•ฉ ๊ณต์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ๋Œ€์ž…ํ•˜๋ฉด,

\[ 1 + 2 + 3 + \cdots + (n - 1) = \frac{(n - 1) n}{2} \]

\[ end(n) = 1 + 6 \cdot \frac{(n - 1) n}{2} = 1 + 3n (n - 1) \]

  • ๋”ฐ๋ผ์„œ N์ด ๋ช‡ ๋ฒˆ์งธ ๋ ˆ์ด์–ด์— ์†ํ•˜๋Š”์ง€๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

\[ N \le 1 + 3n (n - 1) \]

  • ์ด๋ฅผ 2์ฐจ ๋ฐฉ์ •์‹์œผ๋กœ ๋ณ€ํ˜•ํ•˜๊ณ  ๊ทผ์˜ ๊ณต์‹์„ ์“ฐ๋ฉด n์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

\[ 3n^2 - 3n + 1 - N \ge 0 \]

\[ n = \frac{3 \pm \sqrt{12N - 3}}{6} \]

  • ๋˜ํ•œ ์–‘์ˆ˜๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ตœ์ข…์ ์œผ๋กœ๋Š” ๋‹ค์Œ ์‹์ด ๋œ๋‹ค.

\[ n = \frac{3 + \sqrt{12N - 3}}{6} \]

์ด๋ ‡๊ฒŒ ๊ตฌํ•˜๋Š” n์˜ ๊ฐ’์€ N์ด ์ •ํ™•ํžˆ ๋งˆ์ง€๋ง‰ ๋ฐฉ์˜ ์ˆซ์ž๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ์— ์ค‘๊ฐ„๊ฐ’์ด ๋‚˜์˜ค๋ฏ€๋กœ, ceil๋กœ ์˜ฌ๋ฆผ์„ ํ•ด์„œ ๊ตฌํ•˜๋Š” ๊ฐ’์ด ์ตœ์ข… ๋‹ต์ด ๋œ๋‹ค.

์ˆ˜์‹์„ ์ด์šฉํ•ด ํ•œ ๋ฒˆ์— ๋ฐ”๋กœ ๋‹ต์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด๋ฏ€๋กœ O(1)์˜ ์•„์ฃผ ๋น ๋ฅธ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์ฝ”๋“œ

์ถ”๊ฐ€ ํ’€์ด ์ฝ”๋“œ
#include <iostream>

#include <cmath>


using namespace std;

int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int iN{};
    cin >>  N;

    // ์ตœ๋Œ€ํ•œ ์˜ค์ฐจ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ฒ”์œ„๊ฐ€ ํฐ long double์„ ์‚ฌ์šฉ
    long double ldNum = (3.0L + sqrtl(12.0L * iN - 3.0L)) / 6.0L;

    // long double ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ ceil๋„ ์ด์— ๋งž์ถฐ ceill๋กœ ์‚ฌ์šฉ
    cout << static_cast<int>(ceill(ldNum));

    return 0;
}

๐Ÿ’ญ ํ›„๊ธฐ

๊ทœ์น™๊นŒ์ง€๋Š” ๋ฌธ์ œ ์—†์ด ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์ˆ˜์‹์œผ๋กœ ๊ณต์‹ํ™”๊นŒ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ถ€๋ถ„์ด ํฅ๋ฏธ๋กœ์› ๋‹ค. ์•ž์œผ๋กœ๋„ ์–ด๋– ํ•œ ๊ทœ์น™์„ ์ฐพ์œผ๋ฉด ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ณต์‹ํ™”ํ•ด์„œ O(1)์˜ ์‹œ๊ฐ„์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

Comments