์๊ณ ๋ฆฌ์ฆ (1) - ์ํ : ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ , ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (๋๋จธ์ง ์ฐ์ฐ, ์ต๋ ๊ณต์ฝ์, ์ต์๊ณต๋ฐฐ์, ์์)
- -
์ํ๊ณผ ๊ด๋ จํ ๊ธฐ์ด๋ฌธ์ ์๋ ํฌ๊ฒ 3๊ฐ์ง ๋ถ๋ฅ๋ก ๋๋์ด์ง๋ค.
- ๋๋จธ์ง ์ฐ์ฐ
- ์ต๋ ๊ณต์ฝ์, ์ต์ ๊ณต๋ฐฐ์
- ์์ (prime number)
1. ๋๋จธ์ง ์ฐ์ฐ (Modular Arithmetic)
Python ์ผ๋ก ๋ฌธ์ ๋ฅผ ํผ๋ค๋ฉด ์๊ด์๊ฒ ์ง๋ง, C++ , Java์ ๊ฐ์ ๊ฒฝ์ฐ์๋ ํํํ ์ ์๋ ์ ์์ ๊ธธ์ด๊ฐ ์ ํ๋์ด์๋ค.
๊ฐ์ฅ ๊ธด ์ ์ ํํ๋ฐฉ๋ฒ์ธ longlong์ผ๋ก ํ์๋ 8byte์ด๋ฏ๋ก....
๋ฐ๋ผ์ ๋ฌธ์ ์์๋ ์ด๋ฅผ n์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ผ ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ถ์ ํ๊ฒ ๋๋ค. ํํ %๋ฅผ ์ฌ์ฉํ๋ modular.
* ์ด๋ฌํ ์ ํ์ ๋ฌธ์ ๋ฅผ ํ๋ ์์๋๋ฉด ์ข์ ๊ณต์
- ๋ง์ : (A+B)%C = (A%C + B%C)%C
- ๊ณฑ์ : (A*B)%C = (A%C * B%C)%C
- ๋บ์ : (A-B)%C = ((A%C)-(B%C)+C)%C
๋บ์ ์ ๊ฒฝ์ฐ ์์๊ฐ ๋์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์์ด ๋ค๋ฅด๋ค.
๋๋์ ์ ์ฑ๋ฆฝํ์ง ์๋๋ค.
2. ์ต๋๊ณต์ฝ์ (GCD : Greates Common Divisor)
์ ๋ต์ ์ถ๋ ฅ์ด ๋ถ์์ผ๋, ๊ธฐ์ฝ๋ถ์์ ํํ๋ก ์ถ๋ ฅํ๋ผ. ๋ผ๋ ๊ฒฝ์ฐ์ ์ต๋๊ณต์ฝ์(GCD)์ ์ฌ์ฉ์ด ํ์ํ๋ค.
- ์ต๋๊ณต์ฝ์ : A,B ์ ๊ณตํต๋ ์ฝ์์ค, ๊ฐ์ฅ ํฐ ์ฝ์.
- ์ด๋ ์ต๋๊ณต์ฝ์๊ฐ 1์ด๋ผ๋ฉด A,B๋ ์๋ก์(coprime)๋ผ๊ณ ํ๋ค.
* ์ต๋๊ณต์ฝ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ 1 - ๋ฐ๋ณต๋ฌธ
์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ : min(a,b) ~ 2๊น์ง์ ๋ชจ๋ ์ ์๋ก ๋๋์ด์ ํ์ธํ๋ค.(๋ฐ๋ณต๋ฌธ์ ํตํด)
์ด๋ฌํ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋ O(n)์ด ๋๋ค.
์ต๋๊ณต์ฝ์ - Python
GCD = 1 # ์ด์ฐจํผ ๊ณต์ฝ์์ 1์ ๋ฌด์กฐ๊ฑด ๋ค์ด๊ฐ๋ฏ๋ก...
a = int(input()); b = int(input())
i = 2
while(i<=min(a,b)):
if a%i == 0 and b%i ==0 :
GCD = i
i+=1
print(GCD)
์ต๋๊ณต์ฝ์
int g= 1;
for (int i=2; i<=min(a,b); i++){
if (a%i ==0 && b%i ==0){
g=i;
}
}
* ์ต๋๊ณต์ฝ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ 2 - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (Euclidean algorithm)
์์์ ์๊ฐํ ๋ฐฉ๋ฒ 1๋ณด๋ค ๋น ๋ฅด๋ค.
- ์๋ฆฌ : a,b์ ์ต๋๊ณต์ฝ์๋ b์ a%b์ ์ต๋๊ณต์ฝ์์ ๊ฐ๋ค
- ์ฆ, GCD(a,b) = GCD(b,a%b)
- ์ด๋ a%b๋ฅผ r๋ก ํํํ์ ๋, r์ด 0์ด๋ฉด ๊ทธ๋ b๊ฐ ์ต๋๊ณต์ฝ์์ด๋ค.
์๋ฅผ ๋ณด๋ฉด ์ฝ๊ฒ ์ดํด๊ฐ ๊ฐ๋ค.
24์ 16์ผ๋ก ์๋ฅผ๋ค์ด๋ณด๋ฉด GCD(24,16) = GCD(16,8) = GCD(8,0)
๋ง์ง๋ง์ r์ด 0์ด ๋์์ผ๋ฏ๋ก, 24์ 16์ ์ต๋๊ณต์ฝ์๋ 8์ด๋ค.
์ ํด๋ฆฌ๋ ํธ์ ๋ฒ ๊ตฌํ 1 - ์ฌ๊ทํจ์ ์ฌ์ฉ
int gcd(int a , int b){
if (b==0){
return a;
}
else {
return gcd(b, a%b);
}
}
์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ์๋ ์๊ฐ๋ณต์ก๋๋ O(log n)์ด ๋๋ค.
์ ํด๋ฆฌ๋ ํธ์ ๋ฒ ๊ตฌํ 2 - ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ
int gcd(int a , int b){
while(b!=0){
int r = a%b;
a = b;
b = r;
}
return a;
}
๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์๋๋ ์๊ฐ๋ณต์ก๋๋ O(log n)์ด ๋๋ค.
์ธ๊ฐ ์์ ์ต๋๊ณต์ฝ์ ๊ตฌํ๊ธฐ - Python
#24, 16, 48์ ์ต์๊ณต์ฝ์๋ฅผ ๊ตฌํด๋ณด์.
def gcd(a, b) :
if b==0:
return a
else :
return gcd(b,a%b)
print(gcd(48,gcd(24,16)))
๊ทธ๋ฅ ๋๊ฐ์ด ๊ตฌํํด์ค๋ค์, GCD(a, ( GCD(b,c) ) ์ ๊ฐ์ด ๊ฒน์ณ์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค. ์๊ฐ 4๊ฐ 5๊ฐ๋ผ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
2. ์ต์๊ณต๋ฐฐ์ (LCM : Least Common Multiple)
์ต์๊ณต๋ฐฐ์๋ ์ค์ฌ์ LCM์ด๋ผ๊ณ ํ๋ฉฐ, ์ต๋๊ณต์ฝ์์ธ GCD๋ฅผ ์์ฉํ์ฌ ๊ตฌํ ์ ์๋ค.
์ต๋๊ณต์ฝ์๋ฅผ ์ดํด ํ๋ค๋ฉด, ์ต์๊ณต๋ฐฐ์๋ ์๋ ๊ณต์๋ง ์๋ฉด ํฌ๊ฒ ์ด๋ ค์ธ๋ด์ฉ์ด ์๋ค.
a,b์ ์ต์๊ณต๋ฐฐ์ = ์ต๋๊ณต์ฝ์ * a/์ต๋๊ณต์ฝ์ * b/์ต๋๊ณต์ฝ์
- LCM(a,b) = GCD*(a / GCD) * (b / GCD)
3. ์์ (Prime Number)
- ์์ : ์ฝ์๊ฐ 1๊ณผ ์๊ธฐ ์์ ๋ฐ์ ์๋ ์
- N์ด๋ผ๋ ์๊ฐ ์์๊ฐ ๋๊ธฐ ์ํ ์กฐ๊ฑด : 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , N-1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์๋ก ๋๋์ด ๋จ์ด์ง๋ฉด ์๋๋ค.
* ์์์ ๊ด๋ จ๋ ์๊ณ ๋ฆฌ์ฆ 2๊ฐ์ง
- ์ฒซ๋ฒ์งธ : ์ด๋ค ์ N์ด ์์์ธ์ง ์๋์ง ํ๋ณํ๋ ๋ฐฉ๋ฒ
- ๋๋ฒ์งธ : N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ชจ๋ ์์ฐ์ ์ค์์ ์์๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ
*์์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ 1- ์กฐ๊ฑด์ N/2 ๋ก
์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ด๊ธฐ์ํด์ ์์์ ๋ฒ์๋ฅผ ์ค์ฌ๋ณด๋ฉด
- ์์ : 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , N/2๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์๋ก ๋๋์ด ๋จ์ด์ง๋ฉด ์๋๋ค.
- N/2 ์ธ ์ด์ : N์ ์ฝ์ ์ค์์ ๊ฐ์ฅ ํฐ ๊ฒ์ N/2๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค. )
- ์ค์ํฌ์ธํธ : ์์๊ฐ ๋๊ธฐ์ํ ์กฐ๊ฑด์ด
N-1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ด ์๋๋ผ, N/2๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ผ๋ก ํ์ฌ์ผ ์ฝ๋๊ตฌํ์ ์๊ฐ๋ณต์ก๋๋ฅผ ์ข ๋ ํจ์จ์ ์ผ๋ก ์ค์ผ ์ ์๋ค.
n์ด ์์์ธ์ง ์๋์ง ํ๋ณ
bool prime(int n){
if (n < 2){
return False;
}
for (int i=2; i<=n/2; i++){
if (n % i ==0){
return False;
}
}
return True;
}
์๊ฐ๋ณต์ก๋ : O(n)
*์์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ 2 - ์กฐ๊ฑด์ ๋ฃจํธN ์ผ๋ก
- ์์ : 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , ๋ฃจํธ N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์๋ก ๋๋์ด ๋จ์ด์ง๋ฉด ์๋๋ค.
- ๋ฃจํธ N์ธ ์ด์ : N์ด ์์๊ฐ ์๋๋ผ๋ฉด N = a*b ๋ก ๋ํ๋ผ ์ ์๋ค. (a<=b)
- ๋ ์ a,b์ ์ฐจ์ด๊ฐ ๊ฐ์ฅ ์์ ๊ฒฝ์ฐ๋ ๋ฃจํธ N์ผ ๊ฒฝ์ฐ์ด๋ค.
- ๋ฐ๋ผ์ ๋ฃจํธ N๊น์ง๋ง ๊ฒ์ฌ๋ฅผ ํด๋ณด๋ฉด ์์์ธ์ง ์๋์ง ํ๋ณ์ด ๊ฐ๋ฅํ๋ค.
n์ด ์์์ธ์ง ์๋์ง ํ๋ณ
bool prime(int n){
if (n < 2){
return False;
}
for (int i=2; i*i<=n; i++){
if (n % i ==0){
return False;
}
}
return True;
}
์ด ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์๊ฐ๋ณต์ก๋ ํจ์จ์ด ์ข๋ค. ์๊ฐ๋ณต์ก๋๋ O(๋ฃจํธN)
*์์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ 3 - ์๋ผํ ์คํ ๋ค์ค์ ์ฒด
* 1๋ถํฐ N๊น์ง์ ๋ฒ์์ ๋ชจ๋ ์์๋ฅผ ๊ตฌํ ๋ ์ฌ์ฉํ ๋ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
- (1) 2๋ถํฐ N๊น์ง์ ๋ชจ๋ ์๋ฅผ ์จ๋๋๋ค.
- (2) ์์ง ์ง์์ง์ง ์์ ์ ์ค์์ ๊ฐ์ฅ ์์ ์๋ฅผ ์ฐพ๋๋ค.
- (3) ๊ทธ ์๋ ์์์ด๋ค.
- (4) ์ด์ ๊ทธ ์์ ๋ฐฐ์๋ฅผ ๋ชจ๋ ์ง์ด๋ค.
์๋ฅผ๋ค์ด 2๋ถํฐ 100๊น์ง๋ก ๋ฒ์๋ฅผ ์ก๊ณ ๊ตฌํํด๋ณด๋ฉด,
์ฌ๊ธฐ์ ์ ์ผ ์์ ์๋ 2์ด๊ณ , 2๋ ์์์ด๋ค. ๋ฐ๋ผ์ 2์ ๋ฐฐ์๋ฅผ ์ง์ด๋ค.
์ฌ๊ธฐ์ ์ง์์ง์ง ์์์ผ๋ฉฐ, ์ ์ผ ์์ ์๋ 3์ด๋ค. 3์ ์์์ด๋ค. ๋ฐ๋ผ์ 3์ ๋ฐฐ์๋ฅผ ์ง์ด๋ค.
๋ค์์ 5์ด๋ฉฐ, 5๋ ์์์ด๋ฏ๋ก 5์ ๋ฐฐ์๋ฅผ ์ง์ด๋ค.
๋ค์์ 7์ด๋ฉฐ, 7์ ์์์ด๋ค. 7์ ๋ฐฐ์๋ฅผ ์ง์ด๋ค.
๋ค์์ 11์ ๋ฐฐ์์ด์ง๋ง 11์ ๋ฐฐ์๋ค์ ์ด๋ฏธ ์ง์์ก๋ค. (11์ ์ ๊ณฑ์ 121์ธ๋ฐ, 100์ ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋์ด์ ์ํ ํ ํ์๊ฐ ์๋๊ฒ์ด๋ค.)
์ฌ๊ธฐ๊น์ง ํ๋ค๋ฉด ์์๋ฅผ ๋ชจ๋ ๊ตฌํ๋ค.
* ์ฝ๋๋ก ๊ตฌํํ ๋๋ ์ง์ฐ๋ ๊ณผ์ ์ ํ์ง ์๋๋ค. ๋ฐฐ์ด์ ๊ณ์ํ์ฌ ์์ ํ๊ฒ๋๋ฉด ์๊ฐ๋ณต์ก๋๊ฐ ์๋นํ ๋์ด๋๊ฒ ๋๋ค.
๋ฐ๋ผ์, ์ง์์ก๋์ง ์๋์ง๋ฅผ ๊ฒ์ฌํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๊ฒ ๋๋ค.
์๋ผํ ์คํ ๋ค์ค์ ์ฒด - ์ฝ๋๊ตฌํ
int prime[100]; //1~100 ์ ์ฅ
int pn=0; //์์์ ๊ฐ์ ์นด์ดํ
bool check[101]; //์ง์์ก์ผ๋ฉด true
int n = 100; //100๊น์ง ์์
for (int i = 2; i<=n; i++){
if (check[i] == false){ //์ง์์ง์ง ์์๋ค๋ฉด
prime[pn++] = i; // ์์ ์นด์ดํ
++
for (int j = i*i ; j<=n; j+=i){ //๋ฌธ์ ์์ i์ ์๊ฐ ํด๊ฒฝ์ฐ, i*i๋ฅผ i*2 ์ ๋๋ก ๋ฐ๊พธ๋๊ฒ ์ข๋ค.
check[j] = true;
}
}
}
์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ ๋งค์ฐ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ฉฐ, ์๊ฐ๋ณต์ก๋๋ O(nloglogn)์ด๋ค.
์๋ผํ ์คํ ๋ค์ค์ ์ฒด๋ฅผ ์ด์ฉํ์ฌ, ์์ ๊ตฌํ๊ธฐ - (Python) ํ์ด์ฌ ์ฌ์ฉ
r = int(input()) #์
๋ ฅํ๋ ๋งํผ ๋ฒ์
check = [False for _ in range(r)]
for i in range(2,int(r**0.5)) : # 2๋ถํฐ ~ ๋ฒ์(r)์ ์ ๊ณฑ๊ทผ๊น์ง
if check[i] == False : # ์ง์์ง์ง ์๊ณ , ๊ฐ์ฅ ์์์๋ผ๋ฉด
for j in range(i*2 , r, i ): # i์ 2๋ฐฐ์ ๋ถํฐ, 3๋ฐฐ์, 4๋ฐฐ์, .... ๋ฒ์๋๊น์ง ์ง์ด๋ค.(True๋ก)
check[j] = True
prime_number = [i for i,j in enumerate(check) if i>=2 and j==False]
print(prime_number)
*range์ 3๋ฒ์งธ parameter๋ ์ ํํ ์ซ์์ด๋ค. ์ฆ, i์ ๋ฐฐ์๋ฅผ ์ง์์ผ ํ๊ธฐ ๋๋ฌธ์ 3๋ฒ์งธ ์ธ์์ i๋ฅผ ๋ฃ์ด์ค๋ค.
*๊ด๋ จ๋ฌธ์
https://www.acmicpc.net/problem/10430
https://infinitt.tistory.com/231
https://infinitt.tistory.com/233
https://infinitt.tistory.com/234
https://infinitt.tistory.com/235
https://infinitt.tistory.com/236
https://infinitt.tistory.com/237
https://infinitt.tistory.com/238
'๐งฎ PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค (boj) ํ์ด์ฌ - 9613๋ฒ : GCD ํฉ (0) | 2020.04.17 |
---|---|
๋ฐฑ์ค (boj) ํ์ด์ฌ - 2609๋ฒ : ์ต๋๊ณต์ฝ์์ ์ต์๊ณต๋ฐฐ์ (0) | 2020.04.17 |
๋ฐฑ์ค (boj) ํ์ด์ฌ - 1934 : ์ต์๊ณต๋ฐฐ์ (0) | 2020.04.17 |
๋ฐฑ์ค(boj) ํ์ด์ฌ - 9093 : ๋จ์ด ๋ค์ง๊ธฐ (0) | 2020.04.15 |
๋ฐฑ์ค(boj) ํ์ด์ฌ - 1377 ๋ฒ : ๋ฒ๋ธ ์ํธ (1) | 2020.04.13 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค