[ Do it! ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ with JAVA ] - ์‹œ๊ฐ„๋ณต์žก๋„

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 ์œผ๋กœ ์œ ์ง€๋œ๋‹ค

 

์ด์™€ ๊ฐ™์ด ์ž์‹ ์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์‹ค์ œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด ์›๋ฆฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์€ ๋„์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ๋ถ€๋ถ„์„ ์—ฐ์‚ฐ์— ๋”์šฑ ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋กœ ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค