YJzero 2023. 2. 3. 23:52

๐Ÿ“–์˜ค๋Š˜ ๋ฐฐ์šด  ๊ฒƒ

๋ฌธ์ œ ํ•ด๊ฒฐ ํŒจํ„ด

๋นˆ๋„์ˆ˜ ์„ธ๊ธฐ ํŒจํ„ด(FREQUENCY COUNTERS)

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

 

์˜ˆ์‹œ) same ํ•จ์ˆ˜์—๊ฒŒ 2๊ฐœ์˜ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๊ณ , ๋‘๋ฒˆ์งธ ๋ฐฐ์—ด์˜ ๊ฐ’๋“ค์ด ์ฒซ ๋ฒˆ์žฌ ๋ฐฐ์—ด์˜ ์ œ๊ณฑ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๊ฐ€์ง€๋ฉด true๋ฅผ ๋ฐ˜ํ™˜.

same([1, 2, 3], [4, 1, 9]) //true
same([1, 2, 3], [1, 9])//false
same([1, 2, 1], [4, 4, 1]) //false

 

  • ์ค‘์ฒฉ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
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;
}

๋นˆ๋„์ˆ˜ ์„ธ๊ธฐ ํŒจํ„ด์ด ์•„๋‹ˆ๋ผ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ์ด์šฉํ•ด์„œ๋„ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n^2)์ธ๋ฐ ๊ทธ ์ด์œ ๋Š” indexOf๋Š” ํ•˜๋‚˜์˜ ๋ฐ˜๋ณต๋ฌธ์„ ๋‹จ์ถ•ํ•ด์„œ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ค‘์ฒฉ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฐ™๋‹ค.

 

  • ๋นˆ๋„์ˆ˜ ์„ธ๊ธฐ ํŒจํ„ด
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;
}

์œ„์˜ ์ฝ”๋“œ๋Š” ๋นˆ๋„์ˆ˜ ์„ธ๊ธฐ ํŒจํ„ด, ์ฆ‰ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ์ด๋‹ค. ์ค‘์ฒฉ๋ฃจํ”„๊ฐ€ ์—†์–ด์ง„ ๋Œ€์‹  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ˜๋ณต๋ฌธ์ด ์‚ฌ์šฉ๋˜์—ˆ๋Š”๋ฐ ๋‘ ๊ฐœ์˜ ๋ฐ˜๋ณต๋ฌธ์ด ์ค‘์ ‘๋œ ๊ฐœ๋ณ„ ๋ฃจํ”„๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ๋‹ค! ๊ฐœ๋ณ„ ๋ฃจํ”„๊ฐ€ 2๊ฐœ์ธ ๊ฒฝ์šฐ ๋งŒ์•ฝ n์ด 1000์ด๋ผ๋ฉด 2000๋ฒˆ์„ ๋Œ๋ฉด๋˜๋Š”๋ฐ ์ค‘์ฒฉ ๋ฃจํ”„์ธ ๊ฒฝ์šฐ 1000 * 1000 ๋งŒํผ ๋Œ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์›ฌ๋งŒํ•˜๋ฉด ์ค‘์ฒฉ ๋ฃจํ”„๋Š” ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ์กด์žฌ์—ฌ๋ถ€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋นˆ๋„์ˆ˜๋„ ์ผ์น˜ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค.

 

๋ฌธ์ œ) ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ํ•จ์ˆ˜์— ์ „๋‹ฌํ–ˆ์„ ๋•Œ ๋‘ ๋ฌธ์ž์—ด์ด ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š” ๊ธ€์ž๋ฅผ ๊ฐ€์ง€๋Š”์ง€ ํ™•์ธ

function validAnagram(string1, string2){
  if(string1.length !== string2.length) return false;
  
  const stringObj = {};
  for(let str of string1) {
    stringObj[str] = (stringObj[str] || 0) + 1;
  }

  for(let str of string2) {
    if(!stringObj[str]) return false;
      --stringObj[str];
  }
  
  return true;
}

๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ฐ”๋กœ false๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

์ฒซ๋ฒˆ์งธ ๋ฌธ์ž์—ด์„ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ๊ฐ์ฒด์— ๊ธ€์ž ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ ๋ฌธ์ž์—ด์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋Œ๋ฉด์„œ ํ•ด๋‹น ๊ฐ’์ด ์œ„์—์„œ ์ €์žฅํ•œ ๊ฐ์ฒด์— ์กด์žฌํ•˜๋ฉด -1์„ ํ•ด์ค€๋‹ค.

 

 

๋‹ค์ค‘ ํฌ์ธํ„ฐ(MULTIPLE POINTERS)

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

 

์˜ˆ์‹œ) ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ทจํ•˜๋Š” sumZero ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ์ด ๋ฐฐ์—ด์—์„œ ํ•œ ์Œ์˜ ํ•ฉ์ด 0์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฒซ๋ฒˆ์งธ ์Œ์„ ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ดํ•œ๋‹ค. ์—†๋Š” ๊ฒฝ์šฐ undefined๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

โ—์ค‘์š”ํ•œ ์ ์€ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋œ ์ƒํƒœ๋ผ๋Š” ๊ฒƒ์ด๋‹คโ—

  • ์ค‘์ฒฉ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
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[1], arr[j]];
      }
    }
  }
}

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

๊ณต๊ฐ„ ๋ณต์žก๋„: 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++;
    }
  }
}

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

๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)

 

 

๋ฌธ์ œ) countUniqueValues๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ๋ฐฐ์—ด์˜ ์ค‘๋ณต์„ ์ œ์™ธํ•œ ๊ณ ์œ ํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค.

function countUniqueValues(arr){
  let i = 0;
  let j = 1;
  
  while(j <= arr.length - 1) {
    if(arr[i] !== arr[j]){
      i++;
      arr[i] = arr[j];
    }
    j++;
  }
  
return arr.length > 0 ? i+1 : i;
}

ํฌ์ธํ„ฐ๋ฅผ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰์‹œํ‚ค๋„๋ก ํ•œ๋‹ค. i = 0, j= 1์—์„œ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๋งŒ์•ฝ i์™€ j๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ค‘๋ณต๋œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— i๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  j๋ฅผ +1 ํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅด๋‹ค๋ฉด i์— +1์„ ํ•œ ํ›„ ํ˜„์žฌ ์ธ๋ฑ์Šค i์˜ ๊ฐ’์„ j์˜ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ์ฆ‰, ๊ณ ์œ ์˜ ๊ฐ’์„ ๋ฐฐ์—ด์˜ ์•ž์— ์ •๋ ฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋‹ค์ค‘ ํฌ์ธํ„ฐ ๋ถ€๋ถ„์ด๋ผ ํ•ด๋‹น ํŒจํ„ด์„ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋Š”๋ฐ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ Set์„ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ค‘๋ณต์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

 

๐Ÿ’ญ๋ฐฐ์šด ์ 

์ ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋… ์ž์ฒด์— ๋‹ค๊ฐ€๊ฐ€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์•„์ง๊นŒ์ง€ ๋“ค์–ด๋ณธ ๋ถ€๋ถ„๋„ ์žˆ๊ณ  ์˜ˆ์‹œ ์ฝ”๋“œ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์‰ฌ์šด ํŽธ์ด๋ผ ์ดํ•ดํ•˜๋Š”๋ฐ์— ์–ด๋ ค์›€์€ ์—†์ง€๋งŒ ๋ณธ๊ฒฉ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐฐ์šฐ๊ฒŒ ๋˜๋ฉด ์–ด๋ ค์šธ ๊ฑฐ๋ผ๋Š” ๊ฑฑ์ •์ด ๋“ ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋ฌธ์ œ ํ•ด๊ฒฐํŒจํ„ด ๋“ฑ์„ ๋จผ์ € ๋ฐฐ์šฐ๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ํŒจํ„ด์„ ์จ์•ผํ•˜๊ณ , ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผํ•˜๋Š”์ง€ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์šฐ๋Š” ๊ธฐ๋ถ„์ด ๋“ค์–ด์„œ ์ข‹๋‹ค. ์š•์‹ฌ๋‚ด์„œ ์ง„๋„๋ฅผ ๋นผ๋Š” ๊ฒƒ๋ณด๋‹ค ์ดํ•ด์— ์ค‘์ ์„ ๋‘ฌ์„œ ์ค‘๊ฐ„์— ํƒˆ์ฃผํ•˜์ง€ ์•Š๊ณ  ์™„๊ฐ•ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์žก์•„์•ผ๊ฒ ๋‹ค.