[BaekJoon 2292][๐ค2] ๋ฒ์ง
โ ๋ฌธ์
๐ฏ ๋์ด๋
Bronze ๐ค2
๐ง ํ์ด
1. ๋ด ํ์ด (๊ท์น ์ฐพ๊ธฐ)
- ์๊ณ ๋ฆฌ์ฆ
Mathematics
- ์ค๋ช
ํน์ ๊ท์น์ ์ฐพ์๋ด์ด ๊ทธ ๊ท์น์ ๋ฐ๋ผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ ๋ต์ ์ฐพ์๋ด๋ ๋ฐฉ์์ผ๋ก ํ์๋ค.
๋ฐฉ ํ๋๊ฐ ์ก๊ฐํ ๋ชจ์์ ์๊ณ ๋ฐฉํฅ์ ๋๋ฉฐ ๋ฐฉ์ด ํ๋์ฉ ๋์ด๋๋ ๊ตฌ์กฐ์ด๋ค. BFS๋ ์๊ฐํด ๋ดค์ง๋ง ๋๋ฌด ๋ณต์กํ ๊ฒ ๊ฐ์๊ณ , ๊ทธ๋ํ๋ฅผ ์ด์ฉํ ๋ฐฉ์๋ ํ๋ค์ด ๋ณด์ฌ์ ๊ฒฐ๊ตญ์ ์ด๋ ํ ๊ท์น์ ์ฐพ๋๊ฒ ๋ง๋ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ ํ๋ค.
๊ท์น์ ์๊ฐ๋ณด๋ค ๋จ์ํ๋ค.
๋ฐ๊นฅ ๋ ์ด์ด๊ฐ ํ ๊ฒน ๋์ด๋ ๋๋ง๋ค ๋์ด๊ฐ๋ ๋ฐฉ์ ๊ฐฏ์๊ฐ 6๊ฐ๊ฐ ๋ ์๊ธด๋ค.
์ฆ, ๊ฐ๊ฐ์ ๋ ์ด์ด์ ๋ฐฉ์ ๊ฐฏ์๋ฅผ ์ธ์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- 1 ๋ ์ด์ด : 1๊ฐ (1)
- 2 ๋ ์ด์ด : 7๊ฐ (1 + 6)
- 3 ๋ ์ด์ด : 19๊ฐ (7 + 12)
- 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