2024. 8. 12. 14:10ใ๐์๊ณ ๋ฆฌ์ฆ ํผ๋๋ฐฑ/์ฝํ ๊ด๋ จ ๊ฐ์ข
[์๊ฐ๋ณต์ก๋]
-> ์๊ณ ๋ฆฌ์ฆ์์ ์๊ฐ ๋ณต์ก๋๋ ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ฐ์ฐ ํ์๋ฅผ ๋งํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ํ ์๊ฐ์ 1์ต๋ฒ์ ์ฐ์ฐ์ 1์ด์ ์๊ฐ์ผ๋ก ๊ฐ์ฃผํ์ฌ ์์ธกํ๋ค
[์๊ฐ๋ณต์ก๋ ์ ํ]
* ๋น -์ค๋ฉ๊ฐ : ์ต์ ์ผ ๋(best case)์ ์ฐ์ฐ ํ์๋ฅผ ๋ํ๋ธ ํ๊ธฐ๋ฒ
* ๋น - ์ธํ : ๋ณดํต์ผ ๋(average case)์ ์ฐ์ฐ ํ์๋ฅผ ๋ํ๋ธ ํ๊ธฐ๋ฒ
* ๋น - ์ค: ์ต์ ์ผ ๋(worst case)์ ์ฐ์ฐ ํ์๋ฅผ ๋ํ๋ธ ํ๊ธฐ๋ฒ
์์
- 0~99์ฌ์ด์ ๋ฌด์์๊ฐ์ ์ฐพ์ ์ถ๋ ฅํ๋ ์ฝ๋
๋น - ์ค๋ฉ๊ฐ ํ๊ธฐ๋ฒ์ ์๊ฐ๋ณต์ก๋๋ 1๋ฒ , ๋น -์ธํ ํ๊ธฐ๋ฒ์ ์๊ฐ ๋ณต์ก๋๋ 2/N ๋ฒ , ๋น - ์ค ํ๊ธฐ๋ฒ์ ์๊ฐ ๋ณต์ก๋๋ N๋ฒ์ด๋ค
public class timeComplexityEx {
public static void main(String[] args){
// 1~100 ์ฌ์ด์ ๋๋ค ๊ฐ ์ ํ
int findNum = (int)(Math.random() * 100); //์ฌ๊ธฐ์ N = 100
for(int i=0; i<100;i++){
if(i==findNum){
System.out.println(i);
break;
}
}
}
}
์ฌ๊ธฐ์ N= 100์ด๊ณ ,
ํ๊ท ์ ์ผ๋ก 50๋ฒ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ๊ฐ๋ฅ -> ๋น -์ธํ๋ N/2
99๋ฒ์งธ๊น์ง ๊ฐ์ ์ฐพ์ง ๋ชปํ๊ณ , ๋ง์ง๋ง์์์ผ ๊ฐ์ ์ฐพ๋ ๊ฒฝ์ฐ(์ต์ ์ ๊ฒฝ์ฐ) -> ๋น ์ค๋ N (100)
์ค์ ๋ก ์ฝ๋ฉํ ์คํธ๋ฅผ ํ ๋์๋ 3๊ฐ์ง ์ ํ ์ค ๋น -์ค(์ต์ ์ ๊ฒฝ์ฐ)๋ฅผ ์๊ฐํด์ผํ๋ค!
-> ์ฝ๋ฉํ ์คํธ์ test set์ input์ด ์ฌ๋ฌ ์ผ์ด์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ํญ์ ๊ฐ์ฅ ์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ์ผ๋ํด๋์ด์ผํ๋ค

์๋ฅผ ๋ค์ด
logN ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์ฐ์ฐ์
100๋ฒ ์ด ํ์ํ๋ค๊ณ ํ ๋ ... 2^6 = 64, 2^7 = 128, ์ฆ 7๋ฒ ๋ง์ ๊ฐ์ ์ฐพ์ ์ ์๋ค
[์๊ฐ๋ณต์ก๋ ํ์ฉํ๊ธฐ]
์) N๊ฐ์ ์๊ฐ ์ฃผ์ด์ก์ ๋ ์ด๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค
- ์ ๋ ฅ: 1๋ฒ์งธ ์ค์ ์์ ๊ฐ์ N(1 <= N <= 1,000,000), 2๋ฒ์งธ ์ค๋ถํฐ๋ N๊ฐ์ ์ค์ ์ซ์๊ฐ ์ฃผ์ด์ง๋ค. ์ด ์๋ ์ ๋๊ฐ์ด 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค. ์๋ ์ค๋ณต๋์ง ์๋๋ค(์๊ฐ์ ํ 2)
-> ํ ์คํธ ์ผ์ด์ค์ ์ซ์๋ฒ์๊ฐ ์์์ง๋ผ๋, ๋ฐฑ๋ง๊น์ง์ ์๋ฅผ ์ผ๋ํด๋๊ณ ํ์ด์ผํ๋ค
์๊ฐ์ ํ์ด 2์ด์ด๋ฏ๋ก, ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ค๋ฉด 2์ต๋ฒ ์ดํ์ ์ฐ์ฐ ํ์๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋ค
๋ฐ๋ผ์ ๋ฌธ์ ์์ ์ฃผ์ด์ง ์๊ฐ ์ ํ๊ณผ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ๋ฐํ์ผ๋ก ์ด๋ค ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํ ๊ฒ์ธ์ง๋ฅด ํ๋จํ ์ ์๋ค
(์ฐ์ฐ ํ์๋ 1์ด์ 1์ต๋ฒ ์ฐ์ฐํ๋ ๊ฒ์ ๊ธฐ์ค์ผ๋ก ์๊ฐํ๊ธฐ, ์๊ฐ ๋ณต์ก๋๋ ํญ์ ์ต์ ์ผ๋,= ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํด ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค)
- ์ฐ์ฐํ์ ๊ณ์ฐ ๋ฐฉ๋ฒ
์ฐ์ฐ ํ์ = ์๊ณ ๋ฆฌ์ฆ ์๊ฐ ๋ณต์ก๋ X ๋ฐ์ดํฐ์ ํฌ๊ธฐ
- ์๊ณ ๋ฆฌ์ฆ ์ ํฉ์ฑ ํ๊ฐ
* ๋ฒ๋ธ ์ ๋ ฌ(N^2) = (1,000,000)^2 = 1,000,000,000,000 > 2,000,000,000 => ๋ถ์ ํฉ ์๊ณ ๋ฆฌ์ฆ
* ๋ณํฉ ์ ๋ ฌ(NlogN) = 1,000,000 log(1,000,000) = ์ฝ 6,000,000 < 200,000,000 => ์ ํฉ ์๊ณ ๋ฆฌ์ฆ
[์๊ฐ ๋ณต์ก๋ ๋์ถ ๊ณ ๋ ค์ฌํญ ]
1. ์์๋ ์๊ฐ ๋ณต์ก๋ ๊ณ์ฐ์์ ์ ์ธํ๋ค
2. ๊ฐ์ฅ ๋ง์ด ์ค์ฒฉ๋ ๋ฐ๋ณต๋ฌธ์ ์ํ ํ์๊ฐ ์๊ฐ ๋ณต์ก๋์ ๊ธฐ์ค์ด ๋๋ค
- ์ฐ์ฐ ํ์๊ฐ N์ธ ๊ฒฝ์ฐ
public class ์๊ฐ๋ณต์ก๋_ํ๋ณ์๋ฆฌ1 {
public static void main(String){
int N = 100000;
int count =0;
for(int i=0; i<N; i++){
System.out.println("์ฐ์ฐ ํ์:", cnt++);
}
}
}
-> ์ด ์ฝ๋์ ์๊ฐ๋ณต์ก๋๋ O(N)
public static void main(String[] args){
int N = 100000;
int count =0;
for(int i=0; i<N; i++){
System.out.println("์ฐ์ฐ ํ์: "+ count++);
}
for(int i=0; i<N; i++){
System.out.println("์ฐ์ฐ ํ์: "+ count++);
}
for(int i=0; i<N; i++){
System.out.println("์ฐ์ฐ ํ์: "+ count++);
}
}
}
-> ์ผ์ฐจ์ for๋ฌธ์ 3๋ฒ ๋๋ฆผ -> ์๊ฐ๋ณต์ก๋ O(3N)
๊ทธ๋ฐ๋ฐ ์๊ฐ๋ณต์ก๋ ์์ผ๋ก O(N) ๊ณผ O(3N) ์ ๋ณ๋ก ์ฐจ์ด๊ฐ ๋์ง ์๋๋ค!
๊ฒฐ๋ก ์ ์ผ๋ก ์๊ฐ๋ณต์ก๋๋ O(N)์ผ๋ก ๋๊ฐ๋ค๊ณ ๋ณธ๋ค
๊ทธ๋ฐ๋ฐ, ์ด์ค for๋ฌธ์ ๊ฒฝ์ฐ ์ฐ์ฐ ํ์๊ฐ N X N => ์ฐ์ฐ ํ์๊ฐ N^2 ์ด๋ค
-> ์๊ฐ๋ณต์ก๋๋ ๊ฐ์ฅ ๋ง์ด ์ค์ฒฉ๋ ๋ฐ๋ณต๋ฌธ์ ๊ธฐ์ค์ผ๋ก ๋์ถํ๋ฏ๋ก ์ด ์ฝ๋์์๋ ์ด์ค for๋ฌธ์ด ์ ์ฒด ์ฝ๋์ ์๊ฐ ๋ณต์ก๋ ๊ธฐ์ค์ด ๋๋ค. ๋ง์ฝ ์ผ๋ฐ for๋ฌธ์ด 10๊ฐ ๋ ์๋ค ํ๋๋ผ๋ ๋์ถ ์๋ฆฌ์ ๊ธฐ์ค์ ๋ฐ๋ผ ์๊ฐ ๋ณต์ก๋์ ๋ณํ ์์ด N^2 ์ผ๋ก ์ ์ง๋๋ค
์ด์ ๊ฐ์ด ์์ ์ด ์์ฑํ ์ฝ๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ ธ์ถํ ์ ์๋ค๋ฉด, ์ค์ ์ฝ๋ฉํ ์คํธ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์ ๋, ์ด ์๋ฆฌ๋ฅผ ๋ฐํ์ผ๋ก ๋ฌธ์ ๊ฐ ๋๋ ์ฝ๋ ๋ถ๋ถ์ ๋์ถํ ์ ์๊ณ , ์ด ๋ถ๋ถ์ ์ฐ์ฐ์ ๋์ฑ ํจ์จ์ ์ธ ๊ตฌ์กฐ๋ก ์์ ํ๋ ์์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค