๐Ÿ‘Š๐Ÿป ๋ฌธ์ œ ํ•ด๊ฒฐ ํŒจํ„ด

_neยท2022๋…„ 6์›” 16์ผ
1

algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
1/1

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ• ๊นŒ?

  1. ์šฐ์„  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•ด ๋ณด์ž.
  2. ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ ํŒจํ„ด์„ ์Šต๋“ํ•˜์ž

๐ŸŒŒ ๋นˆ๋„์ˆ˜ ์„ธ๊ธฐ ํŒจํ„ด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์–‘ํ•œ ๊ฐ’๊ณผ ๋นˆ๋„๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค.

a Native solution.

์‹œ๊ฐ„๋ณต์žก๋„ O(n^2)

function same(arr1, arr2){
	if(arr1.length !== arr2.length){ return false;}
    for(let i = 0; i < arr1.length; i++){
    	let correctIndex = arr2.indexOf(arr1[i] ** 2)
        if(correctIndex === -1){
        	return false;
            }
        arr2.splice(correctIndex, 1)
    }
    return true;
}

Refactored.

์‹œ๊ฐ„๋ณต์žก๋„ O(n)

function same(arr1, arr2){
	if(arr1.length !== arr2.length){ return false;}
    let frequencyCounter1 = {}
    let frequencyCounter2 = {}
    for(let val of arr1){
    	frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1
    }
    for(let val of arr2){
    	frequencyCounter2[val] = (frequencyCounter2[val] || 0) + 1
    }
    for(let key in frequencyCounter1){
    	if(!(key ** 2 in frequencyCounter2)){
        	return false;
        }
        if(frequencyCounter2[key ** 2] !== frequencyCounter1[key]){
        	return false
        }
    }
    return true;
}

๐ŸŒŒ ๋‹ค์ค‘ ํฌ์ธํ„ฐ ํŒจํ„ด

์ธ๋ฑ์Šค๋‚˜ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” ํฌ์ธํ„ฐ๋‚˜ ๊ฐ’์„ ๋งŒ๋“  ๋‹ค์Œ ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ
์ค‘๊ฐ„ ์ง€์ ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ ์ง€์ ์ด๋‚˜ ๋ ์ง€์ ์ด๋‚˜ ์–‘์ชฝ ์ง€์ ์„ ํ–ฅํ•ด ์ด๋™์‹œํ‚ค๋Š” ํŒจํ„ด.
ํ•œ ์Œ์˜ ๊ฐ’์ด๋‚˜ ์กฐ๊ฑด์„ ์ถฉ์กฑ์‹œํ‚ค๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐพ๋Š”๋‹ค๋Š” ๊ฐœ๋….

a Native solution.

์‹œ๊ฐ„๋ณต์žก๋„ O(n^2) ๊ณต๊ฐ„๋ณต์žก๋„ O(1)

function sumZero(arr){
	for(let i = 0; i < arr.length; i++){
    	for(let j = i+1; j < arr.length; j++){
        	if(arr[i] + arr[j] === 0){
            	return [arr[i], arr[j]];
            }
        }
    }
}

Refactored.

์‹œ๊ฐ„๋ณต์žก๋„ O(n) ๊ณต๊ฐ„๋ณต์žก๋„ O(1)

function sumZero(arr){
	let left = 0;
    let right = arr.length -1;
    while(left < right){
    	let sum = arr[left] + arr[right];
        if(sum === 0){
        	return [arr[left], arr[right]];
        }else if(sum > 0){
        	right--;
        }else{
        	left++;
        }
    }
}

๐ŸŒŒ ๊ธฐ์ค€์  ๊ฐ„ ์ด๋™ ๋ฐฐ์—ด ํŒจํ„ด (Sliding window)

๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์€ ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜
ํŠน์ •๋ฐฉ์‹์œผ๋กœ ์—ฐ์†์ ์ธ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.

a Native solution.

์‹œ๊ฐ„๋ณต์žก๋„ O(n^2)

function maxSubarraySum(arr, num){
	if(num > arr.length) {
    	return null;
    }
    let max = -Infinity;
    for(let i = 0; i < arr.length - num + 1; i++){
    	temp = 0;
        for(let j = 0; j < num; j++){
        	temp += arr[i + j];
        }
        if(temp > max) {
    		max = temp;
    	}
    }
    return max;
}

Refactored.

์‹œ๊ฐ„๋ณต์žก๋„ O(n)

function maxSubarraySum(arr, num){
	let maxSum = 0;
    let tempSum = 0;
    if(arr.length < num) return null;
    for (let i = 0; i < num; i++){
    	maxSum += arr[i];
    }
    tempSum = maxSum;
    for(let i = num; i < arr.length; i++){
    	tempSum = tempSum - arr[i - num] + arr[i];
        maxSum = Math.max(maxSum, tempSum);
    }
    return maxSum;
}

๐ŸŒŒ ๋ถ„ํ• ๊ณผ ์ •๋ณต ํŒจํ„ด

๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด ๊ฐ™์€ ํฐ ๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ์…‹์„ ์ฒ˜๋ฆฌ.

a Native solution.

์‹œ๊ฐ„๋ณต์žก๋„ O(N)

function search(arr, val){
	for(let i = 0; i < arr.length; i++){
    	if(arr[i] === val){
        	return i
        }
    }
    return -1;
}

Refactored.

์‹œ๊ฐ„๋ณต์žก๋„ Log(N)-Binary search

function search(array, val){
	let min = 0;
    let max = array.length - 1;
    
    while(min <= max) {
    	let middle = Math.floor((min + max) / 2);
        let currentElement = array[middle];
        
        if(array[middle] < val){
        	min = middle + 1;
        }
        else if(array[middle] > val){
        	max = middle - 1;
        }
        else{
        	return middle;
        }
    }
    return -1;
}
profile
๋„์ ์ด๋Š” ๊ณณ

0๊ฐœ์˜ ๋Œ“๊ธ€