μ•Œκ³ λ¦¬μ¦˜/νƒœκ·Έ 별 풀이

[νˆ¬ν¬μΈν„° μ•Œκ³ λ¦¬μ¦˜]κ³΅ν†΅μ›μ†Œ κ΅¬ν•˜κΈ°

choi95 2021. 7. 2. 11:56

문제

A, B 두 개의 집합이 μ£Όμ–΄μ§€λ©΄ 두 μ§‘ν•©μ˜ 곡톡 μ›μ†Œλ₯Ό μΆ”μΆœν•˜μ—¬ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

 

λ¬Έμ œν’€μ΄

두 배열을 합쳐 μ΄ˆκΈ°ν™” ν•œ μž„μ˜ λ³€μˆ˜λ₯Ό μˆœνšŒν•˜λ©΄μ„œ Array.indexOf() λ©”μ„œλ“œμ™€ 인덱슀 iλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή μš”μ†Œμ˜ 인덱슀 κ°’μ„λΉ„κ΅ν•œλ‹€. 

 

Array.indexOf() λ©”μ„œλ“œλŠ” μ€‘λ³΅λ˜λŠ” μš”μ†Œκ°€ μ—¬λŸ¬ 개 μžˆλ‹€λ©΄ 첫 번째둜 κ²€μƒ‰λœ μš”μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— 쀑볡 된 값을식별할 수 μžˆλ‹€.

 

μ½”λ“œ

function solution(arr1, arr2) {
  let answer = [];
  let tmp = [...arr1, ...arr2];

  tmp.forEach((item, i) => {
    if(tmp.indexOf(item) !== i) {
      answer.push(item);
    }
  })
  console.log(tmp)

  answer.sort((a, b) => a - b);

  return answer;
}

let arr1 = [1, 3, 9, 5, 2];
let arr2 = [3, 2, 5, 7, 8]
console.log(solution(arr1, arr2));

 

λ¬Έμ œν’€μ΄2

사전에 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ 된 각 배열을 반볡문 λ‚΄μ—μ„œ μž„μ˜μ˜ 포인터 λ³€μˆ˜λ₯Ό 톡해 μ€‘λ³΅λœ 값을 μ‹λ³„ν•œλ‹€.

 

μ΄λ•Œ λ°°μ—΄μ˜ μ›μ†Œλ“€μ€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜μ–΄ 있기 λ•Œλ¬Έμ— 포인터 λ³€μˆ˜λ‘œ 가리킨 κ°’ 쀑 μž‘μ€ 값에 ν•΄λ‹Ήν•˜λŠ” λ°°μ—΄μ˜ν¬μΈν„° λ³€μˆ˜λ₯Ό λ‹€μŒ 인덱슀λ₯Ό κ°€λ¦¬ν‚€κ²Œ ν•΄μ€€λ‹€.

 

μ˜€λ¦„μ°¨μˆœ νŠΉμ„± 상 큰 값에 ν•΄λ‹Ήν•˜λŠ” λ°°μ—΄μ˜ 포인터 λ³€μˆ˜λ₯Ό μ΄λ™ν•˜κ²Œ 될 경우 이 값보닀 μž‘μ€ κ°’(κ³΅ν†΅μ›μ†ŒμΌ 수 μžˆλŠ” κ°’)을 이후 인덱슀 μš”μ†Œ λ‚΄μ—μ„œ 찾을 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

 

μ½”λ“œ

function solution(arr1, arr2) {
  let answer = [];
  arr1.sort();
  arr2.sort();
  let p1 = 0;
  let p2 = 0;

  while(p1 < arr1.length && p2 < arr2.length){
    if(arr1[p1] === arr2[p2]) {
      answer.push(arr1[p1++]);
      p2++
    }
    else if(arr1[p1] < arr2[p2]) p1++
    else p2++
  }
  
  return answer;
}

let arr1 = [1, 3, 9, 5, 2];
let arr2 = [3, 2, 5, 7, 8];
console.log(solution(arr1, arr2));