https://www.youtube.com/watch?v=cxhbgAbAiXI&list=PLcXyemr8ZeoTVBFTEB673TC8Ba4UBSTRz&index=6

 

 

리스트에 있는 서로 다른 두 정수의 합이 target number와 같다면 true를 반환하는 함수를 구현하시오.

 

리스트에 있는 서로 다른 두 정수의 합이 target number와 같다면 true를 반환하는 함수를 구현하시오.

 

입력값

num = {1, 2, 15, 6} target Number = 7 

num = {1, 2, 15, 6} target Number = 7 

public static boolean twoSum(){

	for(int i=0;i<nums.length;i++){
    	for(int j=0;j<nums.length;j++){
        	if( i == j ) continue;
            
            int sum = nums[i] + nums[j];
            if( sum == target )
            	return True;
        }
    }
    
    return false;
}

시간복잡도는 O(N^2) 이다.

 

 

위의 코드를 개선해보자.

num = {1, 2, 15, 6} target Number = 7 

public static boolean twoSum(){

	for(int i=0;i<nums.length;i++){
    	for(int j=i + 1;j<nums.length;j++){
            int sum = nums[i] + nums[j];
            if( sum == target )
            	return True;
        }
    }
    
    return false;
}

개선은 되었지만, 시간복잡도는 O(N^2) 이다.

성능자체는 개선되었다.

 

 

HashSet을 활용한다면 훨씬 빨라질것이다.

num = {1, 2, 15, 6} target Number = 7 

public static boolean twoSum(){
	
    for(int i=0;i<nums.length;i++){
    	hashset.add(nums[i]);
    }
    
	for(int i=0;i<nums.length;i++){
    	if( hashset.contains( targetNumber - nums[i] ) == true ){
        	return true;
        }
    }
    
    return false;
}

 

 

시간복잡도는 O(N) 이다.

HashSet 사용시 시간복잡도 조회는 O(1)이다.

 

 

문제가 있다. 코드에는 버그가 잇다.

만약 target Numbers = 4 이다.

1 2 15 6 .. 에서 만약 

만약 2 를 선택했을경우 똑같은 2 가 두번 계산되서 오류가 난다. 문제의 조건은 서로 다른 두 정수인것이다.

num = {1, 2, 15, 6} target Number = 4

public static boolean twoSum(){
	
    Hashset hashset = new HashSet<>();
    
	for(int i=0;i<nums.length;i++){
    	if( hashset.contains( targetNumber - nums[i] ) == true ){
        	return true;
        } else{
        	hashset.add(numbs[i]);
        }
    }
    
    return false;
}

 

이를 통해 중복된 값을 연산하지 않고, 이전까지의 숫자 값에서 targetNumber와 같은 값을 알아낼 수 있다.

 

시간복잡도는, Set만드는작업은 O(1), for문은 N번 반복되고 바디부분에서의 시간복잡도는 O(1)이다.

즉, O(1) + N * O(1)  이므로 O(N) 이다.

 

+ Recent posts