Pseudo-random number generation
๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌด์์ ๋ฐ ์์ฌ ๋ฌด์์ ์ซ์๋ฅผ ์์ฑํ๋ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํด๋์ค์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ๊ท ์ผ ๋์ ๋นํธ ์์ฑ๊ธฐ(URBG)๋ ๊ท ์ผ ๋ถํฌ๋ฅผ ๊ฐ์ง ์ ์ ์ํ์ค๋ฅผ ์์ฑํ๋ ์์ฌ ๋์ ์์ฑ๊ธฐ์ธ ๋์ ์์ง๊ณผ (์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ) ์ง๋์ ์์ฑ๊ธฐ๋ฅผ ๋ชจ๋ ํฌํจํฉ๋๋ค.
- ๋์ ๋ถํฌ (์: uniform , normal , ๋๋ poisson distributions )๋ URBG์ ์ถ๋ ฅ์ ๋ค์ํ ํต๊ณ์ ๋ถํฌ๋ก ๋ณํํฉ๋๋ค.
URBG์ ๋ถํฌ๋ ํจ๊ป ์ฌ์ฉ๋์ด ๋์ ๊ฐ์ ์์ฑํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ชจ๋ ๋์ ์์ง์ ํน์ ์๋ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๊ณ , ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ๋์ด ๋ฐ๋ณต ๊ฐ๋ฅํ ์๋ฎฌ๋ ์ดํฐ์ ํจ๊ป ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
๋ชฉ์ฐจ |
๊ท ์ผ ๋ฌด์์ ๋นํธ ์์ฑ๊ธฐ
๊ท ์ผ ๋์ ๋นํธ ์์ฑ๊ธฐ ๋ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ ๋ฒ์ ๋ด์ ๊ฐ ๊ฐ์ด (์ด์์ ์ผ๋ก) ๋์ผํ ํ๋ฅ ๋ก ๋ฐํ๋๋ ๋ถํธ ์๋ ์ ์ ๊ฐ์ ๋ฐํํ๋ ํจ์ ๊ฐ์ฒด์ ๋๋ค.
๋ชจ๋ ๊ท ์ผ ๋์ ๋นํธ ์์ฑ๊ธฐ๋
UniformRandomBitGenerator
์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค.
C++20์ ๋ํ
uniform_random_bit_generator
๊ฐ๋
์ ์ ์ํฉ๋๋ค.
|
ํค๋ ํ์ผ์ ์ ์๋จ
<random>
|
|
|
(C++20)
|
ํ์
์ด ๊ท ์ผ ๋์ ๋นํธ ์์ฑ์๋ก ์ ํฉํจ์ ๋ช
์
(concept) |
๋์ ์์ง
๋๋ค ๋๋ฒ ์์ง (์ผ๋ฐ์ ์ผ๋ก ์์ง ์ผ๋ก ์ค์ฌ์)์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ํธ๋กํผ ์์ค๋ก ์ฌ์ฉํ์ฌ ์์ฌ ๋์๋ฅผ ์์ฑํ๋ ๊ท ์ผ ๋์ ๋นํธ ์์ฑ๊ธฐ์ ๋๋ค.
์ธ์ ๋ ์ง, ํ์
E
์ ์์ง
e
๋ ์์๊ฐ ์๋ ์ ์
i
์ ๋ํ ์ํ
e
i
๋ฅผ ๊ฐ์ง๋๋ค. ์์ฑ ์,
e
๋ ์์ง ๋งค๊ฐ๋ณ์์ ์ด๊ธฐ ์๋(๋๋ ์๋ ์ํ์ค)์ ์ํด ๊ฒฐ์ ๋๋ ์ด๊ธฐ ์ํ
e
0
๋ฅผ ๊ฐ์ง๋๋ค.
๋ค์ ์์ฑ๋ค์ ๋ชจ๋ ์์ง ์ ํ
E
์ ๋ํด ํญ์ ์ ์๋ฉ๋๋ค:
-
E์ ์ํ ํฌ๊ธฐ๋ฅผE::result_type์ ํฌ๊ธฐ ๋ฐฐ์๋ก ๋ํ๋ธ ๊ฐ(์ฆ, ( sizeof ei) / sizeof ( E :: result_type ) ). -
e
์ ์ํ
e
i๋ฅผ ํ์ ์ํ ei+1๋ก ์ ์ด์ํค๋ ์ ์ด ์๊ณ ๋ฆฌ์ฆ TA (์ฆ, TA ( ei) == ei+1). -
e
์ ์ํ๋ฅผ
E::result_typeํ์ ์ ๊ฐ์ผ๋ก ๋งคํํ๋ ์์ฑ ์๊ณ ๋ฆฌ์ฆ GA , ๊ทธ ๊ฒฐ๊ณผ๋ ์์ฌ ๋์์ ๋๋ค.
์์ฌ ๋์ ์ํ์ค๋ TA ์ GA ๋ฅผ ๋ฒ๊ฐ์ ํธ์ถํ์ฌ ์์ฑํ ์ ์์ต๋๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ธ ๊ฐ์ง ๋ค๋ฅธ ์ข ๋ฅ์ ์์ฌ ๋์ ์์ฑ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ ํด๋์ค ํ ํ๋ฆฟ์ผ๋ก ์ ๊ณตํ๋ฏ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ค ์์ง์ ์ฌ์ฉํ ์ง ์ ํํ๋ ๊ฒ์ ์ฌ๋ฌ ๊ฐ์ง ์ ์ถฉ์ ์ ์๋ฐํฉ๋๋ค:
- ์ ํ ํฉ๋ ์์ง ์ ๋น๊ต์ ๋น ๋ฅด๋ฉฐ ์ํ ์ ์ฅ์ ์ํ ์๊ตฌ ๊ณต๊ฐ์ด ๋งค์ฐ ์์ต๋๋ค.
- ๋ฉ๋ฅด์ผ ํธ์์คํฐ ์์ง ์ ๋ ๋๋ฆฌ๊ณ ์ํ ์ ์ฅ ์๊ตฌ ์ฌํญ์ด ๋ ํฌ์ง๋ง, ์ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ฐ์ฅ ๊ธด ๋น๋ฐ๋ณต ์ํ์ค์ ๊ฐ์ฅ ๋ฐ๋์งํ ์คํํธ๋ผ ํน์ฑ(๋ฐ๋์งํจ์ ์ ์์ ๋ฐ๋ผ)์ ๊ฐ์ง๋๋ค.
- ์บ๋ฆฌ ๊ฐ์ฐ ์์ง ์ ๊ณ ๊ธ ์ฐ์ ๋ช ๋ น์ด ์ธํธ๊ฐ ์๋ ํ๋ก์ธ์์์๋ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํ์ง๋ง, ๋ ํฐ ์ํ ์ ์ฅ ๊ณต๊ฐ๊ณผ ๋๋ก๋ ๋ ๋ฐ๋์งํ ์คํํธ๋ผ ํน์ฑ์ ๊ฐ์ง๋ ๋จ์ ์ด ์์ต๋๋ค.
|
(C++26๋ถํฐ) |
์ด๋ค ๋์ ์์ง ์ค ๊ทธ ์ด๋ ๊ฒ๋
์ํธํ์ ์ผ๋ก ์์ ํ์ง
์์ต๋๋ค. ๋ชจ๋ ๋ณด์ ์์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ํด๋น ๋ชฉ์ ์ ์ํด์๋ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค (์:
OpenSSL
RAND_bytes
).
์ด ํ ํ๋ฆฟ๋ค๋ก๋ถํฐ ์ธ์คํด์คํ๋ ๋ชจ๋ ํ์ ์ RandomNumberEngine ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค.
|
ํค๋ ํ์ผ์ ์ ์๋จ
<random>
|
|
|
(C++11)
|
์ ํ ํฉ๋
์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํจ
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
๋ฉ๋ฅด์ผ ํธ์์คํฐ
์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํจ
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
์บ๋ฆฌ ๊ฐ์ฐ(
์ง์ฐ ํผ๋ณด๋์น
) ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํจ
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++26)
|
์นด์ดํฐ ๊ธฐ๋ฐ ๋ณ๋ ฌํ ๊ฐ๋ฅ ์์ฑ๊ธฐ
(ํด๋์ค ํ ํ๋ฆฟ) |
๋์ ์์ง ์ด๋ํฐ
๋๋ค ๋๋ฒ ์์ง ์ด๋ํฐ๋ ๋ค๋ฅธ ๋๋ค ๋๋ฒ ์์ง์ ์ํธ๋กํผ ์์ค๋ก ์ฌ์ฉํ์ฌ ์์ฌ ๋์๋ฅผ ์์ฑํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ ์์ง์ ์คํํธ๋ผ ํน์ฑ์ ๋ณ๊ฒฝํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
|
ํค๋ ํ์ผ์ ์ ์๋จ
<random>
|
|
|
(C++11)
|
๋์ ์์ง์ ์ผ๋ถ ์ถ๋ ฅ์ ๋ฒ๋ฆผ
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
๋์ ์์ง์ ์ถ๋ ฅ์ ์ง์ ๋ ๋นํธ ์์ ๋ธ๋ก์ผ๋ก ํจํน
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
๋์ ์์ง์ ์ถ๋ ฅ์ ๋ค๋ฅธ ์์๋ก ์ ๋ฌ
(ํด๋์ค ํ ํ๋ฆฟ) |
๋ฏธ๋ฆฌ ์ ์๋ ๋์ ์์ฑ๊ธฐ
์ฌ๋ฌ ๊ตฌ์ฒด์ ์ธ ์ธ๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฏธ๋ฆฌ ์ ์๋์ด ์์ต๋๋ค.
|
ํค๋์ ์ ์๋จ
<random>
|
|
| ์ ํ | ์ ์ |
minstd_rand0
(C++11)
|
std::
linear_congruential_engine
<
std::
uint_fast32_t
,
16807
,
0
,
2147483647
>
1969๋ Lewis, Goodman ๋ฐ Miller๊ฐ ๋ฐ๊ฒฌํ๊ณ , 1988๋ Park๊ณผ Miller์ ์ํด "์ต์ ํ์ค"์ผ๋ก ์ฑํ๋จ |
minstd_rand
(C++11)
|
std::
linear_congruential_engine
<
std::
uint_fast32_t
,
|
mt19937
(C++11)
|
std::
mersenne_twister_engine
<
std::
uint_fast32_t
,
|
mt19937_64
(C++11)
|
std::
mersenne_twister_engine
<
std::
uint_fast64_t
,
|
ranlux24_base
(C++11)
|
std:: subtract_with_carry_engine < std:: uint_fast32_t , 24 , 10 , 24 > |
ranlux48_base
(C++11)
|
std:: subtract_with_carry_engine < std:: uint_fast64_t , 48 , 5 , 12 > |
ranlux24
(C++11)
|
std::
discard_block_engine
<
std::
ranlux24_base
,
223
,
23
>
24๋นํธ RANLUX ์์ฑ๊ธฐ (Martin Lรผscher์ Fred James, 1994) |
ranlux48
(C++11)
|
std::
discard_block_engine
<
std::
ranlux48_base
,
389
,
11
>
48๋นํธ RANLUX ์์ฑ๊ธฐ (Martin Lรผscher์ Fred James, 1994) |
knuth_b
(C++11)
|
std:: shuffle_order_engine < std:: minstd_rand0 , 256 > |
philox4x32
(C++26)
|
std::
philox_engine
<
std::
uint_fast32_t
,
32
,
4
,
10
,
0xCD9E8D57
,
0x9E3779B9
,
0xD2511F53
,
0xBB67AE85
>
|
philox4x64
(C++26)
|
std::
philox_engine
<
std::
uint_fast64_t
,
64
,
4
,
10
,
0xCA5A826395121157
,
0x9E3779B97F4A7C15
,
0xD2E7470EE14C6C93
,
0xBB67AE8584CAA73B
>
|
default_random_engine
(C++11)
|
๊ตฌํ ์ ์ RandomNumberEngine ํ์ |
๋น๊ฒฐ์ ์ ๋์
std::random_device ๋ ๋น๊ฒฐ์ ์ ๊ท ์ผ ๋์ ๋นํธ ์์ฑ๊ธฐ์ ๋๋ค. ํ์ง๋ง ๋น๊ฒฐ์ ์ ๋์ ์์ฑ์ ๋ํ ์ง์์ด ์๋ ๊ฒฝ์ฐ ๊ตฌํ์ฒด๊ฐ std::random_device ๋ฅผ ์์ฌ ๋์ ์์ง์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ ๊ฒ์ด ํ์ฉ๋ฉ๋๋ค.
|
(C++11)
|
ํ๋์จ์ด ์ํธ๋กํผ ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋น๊ฒฐ์ ์ ๋์ ์์ฑ๊ธฐ
(ํด๋์ค) |
๋์ ๋ถํฌ
๋์ ๋ถํฌ๋ URBG์ ์ถ๋ ฅ์ ์ฌํ ์ฒ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ ์ถ๋ ฅ์ด ์ ์๋ ํต๊ณ์ ํ๋ฅ ๋ฐ๋ ํจ์์ ๋ฐ๋ผ ๋ถํฌ๋๋๋ก ํฉ๋๋ค.
๋์ ๋ถํฌ๋ RandomNumberDistribution ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค.
|
ํค๋์ ์ ์๋จ
<random>
|
|
๊ท ์ผ ๋ถํฌ |
|
|
(C++11)
|
๋ฒ์ ๋ด์์ ๊ท ์ผํ๊ฒ ๋ถํฌ๋ ์ ์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
๋ฒ์ ๋ด์์ ๊ท ์ผํ๊ฒ ๋ถํฌ๋ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
๋ฒ ๋ฅด๋์ด ๋ถํฌ |
|
|
(C++11)
|
bool
๊ฐ์
๋ฒ ๋ฅด๋์ด ๋ถํฌ
๊ธฐ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค
(ํด๋์ค) |
|
(C++11)
|
์ดํญ ๋ถํฌ
์์ ์ ์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
์์ดํญ ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ์ ์ ๊ฐ์ ์์ฑํฉ๋๋ค
negative binomial distribution
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
๊ธฐํ ๋ถํฌ
์์ ์ ์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
ํฌ์์ก ๋ถํฌ |
|
|
(C++11)
|
ํธ์์ก ๋ถํฌ
์์ ์ ์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
์ง์ ๋ถํฌ
์์ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
๊ฐ๋ง ๋ถํฌ
์์ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
Weibull distribution
์ ๋ฐ๋ฅธ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
๊ทน๊ฐ ๋ถํฌ
์์ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
์ ๊ท ๋ถํฌ |
|
|
(C++11)
|
ํ์ค ์ ๊ท (๊ฐ์ฐ์์) ๋ถํฌ
์์ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
๋ก๊ทธ ์ ๊ท ๋ถํฌ
์์ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
์นด์ด์ ๊ณฑ ๋ถํฌ
์์ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
์ฝ์ ๋ถํฌ
์์ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
Fisher์ F-๋ถํฌ
์์ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
์ค์ ๊ฐ์
์คํ๋ํธ t-๋ถํฌ
์ ๋ฐ๋ผ ์์ฑํจ
(ํด๋์ค ํ ํ๋ฆฟ) |
ํ๋ณธ ๋ถํฌ |
|
|
(C++11)
|
์ด์ฐ ๋ถํฌ์์ ์ ์ ๊ฐ์ ์์ฑํจ
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
์ผ์ ํ ๋ถ๋ถ ๊ตฌ๊ฐ์ ๋ถํฌ๋ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
์ ์๋ ๋ถ๋ถ ๊ตฌ๊ฐ์ ๋ถํฌ๋ ์ค์ ๊ฐ์ ์์ฑํฉ๋๋ค
(ํด๋์ค ํ ํ๋ฆฟ) |
์ ํธ๋ฆฌํฐ
|
ํค๋ ํ์ผ์ ์ ์๋จ
<random>
|
|
|
(C++11)
|
์ฃผ์ด์ง ์ ๋ฐ๋์ ์ค์ ๊ฐ์
[
โ
0
โ
,
1
)
๊ตฌ๊ฐ์ ๊ท ์ผํ๊ฒ ๋ถํฌ์ํด
(ํจ์ ํ ํ๋ฆฟ) |
|
(C++11)
|
๋ฒ์ฉ ํธํฅ ์ ๊ฑฐ ์คํฌ๋จ๋ธ ์๋ ์ํ์ค ์์ฑ๊ธฐ
(ํด๋์ค) |
๋์ ์๊ณ ๋ฆฌ์ฆ
|
ํค๋ ํ์ผ์ ์ ์๋จ
<random>
|
|
|
(C++26)
|
๋ฒ์๋ฅผ ๊ท ์ผ ๋์ ๋นํธ ์์ฑ๊ธฐ๋ก๋ถํฐ ์์ฑ๋ ๋์๋ก ์ฑ์
(์๊ณ ๋ฆฌ์ฆ ํจ์ ๊ฐ์ฒด) |
C ๋๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์์์ ์ค๋ช ํ ์์ง๊ณผ ๋ถํฌ ์ธ์๋, C ๋๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ์์ ์์๋ค๋ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง ๊ถ์ฅํ์ง ์์ต๋๋ค:
|
ํค๋ ํ์ผ์ ์ ์๋จ
<cstdlib>
|
|
|
์์ฌ ๋์ ์์ฑ
(ํจ์) |
|
|
์์ฌ ๋์ ์์ฑ๊ธฐ ์๋ ์ค์
(ํจ์) |
|
|
std::rand
๊ฐ ์์ฑํ ์ ์๋ ์ต๋๊ฐ
(๋งคํฌ๋ก ์์) |
|
์์
#include <cmath> #include <iomanip> #include <iostream> #include <map> #include <random> #include <string> int main() { // ์ค์ ๋๋ค ๊ฐ์ผ๋ก ์๋ ์ค์ (์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ) std::random_device r; // 1๊ณผ 6 ์ฌ์ด์ ๋๋ค ํ๊ท ๊ฐ ์ ํ std::default_random_engine e1(r()); std::uniform_int_distribution<int> uniform_dist(1, 6); int mean = uniform_dist(e1); std::cout << "๋ฌด์์๋ก ์ ํ๋ ํ๊ท : " << mean << '\n'; // ํด๋น ํ๊ท ์ ์ค์ฌ์ผ๋ก ์ ๊ท ๋ถํฌ ์์ฑ std::seed_seq seed2{r(), r(), r(), r(), r(), r(), r(), r()}; std::mt19937 e2(seed2); std::normal_distribution<> normal_dist(mean, 2); std::map<int, int> hist; for (int n = 0; n != 10000; ++n) ++hist[std::round(normal_dist(e2))]; std::cout << "์ ๊ท ๋ถํฌ (ํ๊ท " << mean << "):\n" << std::fixed << std::setprecision(1); for (auto [x, y] : hist) std::cout << std::setw(2) << x << ' ' << std::string(y / 200, '*') << '\n'; }
๊ฐ๋ฅํ ์ถ๋ ฅ:
๋ฌด์์๋ก ์ ํ๋ ํ๊ท : 4 ์ ๊ท ๋ถํฌ (ํ๊ท 4): -4 -3 -2 -1 0 * 1 *** 2 ****** 3 ******** 4 ********* 5 ******** 6 ****** 7 *** 8 * 9 10 11 12
์ฐธ๊ณ ํญ๋ชฉ
|
C ๋ฌธ์
for
์์ฌ ๋์ ์์ฑ
|