ν•΄μ‹œ(Hash)

μž„μ˜μ˜ 크기λ₯Ό 가진 데이터λ₯Ό κ³ μ •λœ λ°μ΄ν„°μ˜ 크기둜 λ³€ν™˜μ‹œν‚€λŠ” 것

 

νŠΉμ •ν•œ λ°°μ—΄μ˜ μΈλ±μŠ€λ‚˜ μœ„μΉ˜λ₯Ό μž…λ ₯ν•˜κ³ μžν•˜λŠ” λ°μ΄ν„°μ˜ 값을 μ΄μš”ν•΄ μ €μž₯ν•˜κ±°λ‚˜ 찾을 수 μžˆλ‹€. 

해쉬λ₯Ό μ΄μš©ν•˜λ©΄ μ¦‰μ‹œ μ €μž₯ν•˜κ±°λ‚˜ μ°Ύκ³ μžν•˜λŠ” μœ„μΉ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆμœΌλ―€λ‘œ λΉ λ₯Έ μ†λ„λ‘œ μ²˜λ¦¬ν•  수 μžˆλ‹€. 

 

μ €μž₯된 데이터에 λ°”λ‘œ μ ‘κ·Όν•΄μ„œ 값을 κ°€μ Έμ˜¬ 수 μžˆλ‹€. μ°Ύκ³ μžν•˜λŠ” κ°’κ³Ό ν…Œμ΄λΈ”μ˜ μΈλ±μŠ€κ°€ λ™μΌν•˜λ―€λ‘œ 값이 μ €μž₯된 곡간에 λ°”λ‘œ μ ‘κ·Όν•΄μ„œ 값을 κ°€μ Έμ˜¬ 수 μžˆμœΌλ―€λ‘œ μ‹œκ°„λ³΅μž‘λ„λŠ” O(1)이닀. 

 

ν…Œμ΄λΈ”μ— μžˆλŠ” 값을 μ‚½μž…, μˆ˜μ •, μ‚­μ œ ν•˜λŠ” ν–‰μœ„λ„ 값이 μ–΄λ””μžˆλŠ”μ§€λ§Œ μ•Œκ³ μžˆμœΌλ©΄ λͺ¨λ‘ ν•œ 방에 ν•΄κ²°ν•  수 μžˆλ‹€. 

 

ν•΄μ‹œν…Œμ΄λΈ”

ν•΄μ‹œν•¨μˆ˜λΌλŠ” 것에 ν•œ 번 ν†΅κ³Όμ‹œμΌœμ„œ μ‚¬μš©ν•œλ‹€. 

ν•΄μ‹œ ν•¨μˆ˜λŠ” μž„μ˜μ˜ 길이λ₯Ό κ°€μ§€λŠ” μž„μ˜μ˜ 데이터λ₯Ό κ³ μ •λœ 길이의 λ°μ΄ν„°λ‘œ λ§€ν•‘ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 

 

μ–΄λ–€ 값이 λ“€μ–΄μ˜€λ“  간에 λ‹€ λ­‰κ°œμ„œ λ‚΄κ°€ μ›ν•˜λŠ” 길이의 κ°’μœΌλ‘œ λ§Œλ“ λ‹€. 

 

key와 value둜 이루어진 Mapμ΄λΌλŠ” 객체λ₯Ό μ‚¬μš©ν•΄μ„œ ν•΄μ‹œν…Œμ΄λΈ”μ„ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•œλ‹€. 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ Map은 μ‹œκ°„λ³΅μž‘λ„λ₯Ό μ€„μ΄λŠ”λ° 결정적인 역할을 ν•œλ‹€.

 

Map 객체 μ‚¬μš©ν•˜κΈ°

Map 객체 생성

const map = new Map();

 Map의 λ©”μ†Œλ“œμΈ setν•¨μˆ˜ μ‚¬μš©ν•΄μ„œ 객체에 μš”μ†Œ μΆ”κ°€

map.set('B', 1)

κΈ°μ‘΄ 값에닀가 μ¦κ°€μ‹œν‚€κΈ°

map.get('B', 1)

 

 

예제문제 | ν•™κΈ‰νšŒμž₯

문제

ν•™κΈ‰νšŒμž₯을 λ½‘λŠ”λ° ν›„λ³΄λ‘œ 기호 A,B,C,D,E 후보가 등둝을 ν–ˆλ‹€. νˆ¬ν‘œ μš©μ§€μ—λŠ” 반 학생듀이 μ“΄ ν›„λ³΄μ˜ κΈ°ν˜Έκ°€ μ“°μ—¬μžˆμœΌλ©°, μ„ μƒλ‹˜μ€ κ·Έ 기호λ₯Ό λ°œν‘œν•˜κ³  μžˆλ‹€. λ°œν‘œκ°€ λλ‚œ ν›„ μ–΄λ–€ 기호의 후보가 ν•™κΈ‰ 회μž₯이 λ˜μ—ˆλŠ”μ§€ 좜λ ₯해라. 

 

μž…λ ₯예제 | BACBACCACCBDEDE

좜λ ₯예제 | C

 

μ½”λ“œ

const solution = (str) => {
  let answer;
  let student = new Map();

  for (let x of str) {
    if (student.has(x)) {
      student.set(x, student.get(x) + 1);
    } else {
      student.set(x, 1);
    }
  }

  // κ°€μž₯ μž‘μ€ μ •μˆ˜λ₯Ό λΉ„κ΅κ΅°μœΌλ‘œ μ„€μ •
  let max = Number.MIN_SAFE_INTEGER;

  for (let [key, value] of student) {
    if (value > max) {
      max = value;
      answer = key;
    }
  }
  return answer;
}

const str = "BACBACCACCBDEDE";
console.log(solution(str));

 

 

예제문제 | μ•„λ‚˜κ·Έλž¨

문제

μ•„λ‚˜κ·Έλž¨μ΄λž€ 두 λ¬Έμžμ—΄μ΄ μ•ŒνŒŒλ²³μ˜ λ‚˜μ—΄ μˆœμ„œλŠ” λ‹€λ₯΄μ§€λ§Œ κ·Έ ꡬ성이 μΌμΉ˜ν•˜λ©΄ 두 λ‹¨μ–΄λŠ” μ•„λ‚˜κ·Έλž¨μ΄λΌκ³  ν•œλ‹€. μ£Όμ–΄μ§€λŠ” 두 단어가 μ•„λ‚˜κ·Έλž¨μ΄λ©΄ YESλ₯Ό 좜λ ₯ν•˜κ³ , μ•„λ‹ˆλ©΄ NOλ₯Ό 좜λ ₯해라.

 

μž…λ ₯예제 | AbaAeCe, baeeACA

좜λ ₯예제 | YES

 

μ½”λ“œ

const solution = (word1, word2) => {
  // μ•„λ‚˜κ·Έλž¨ : μ•ŒνŒŒλ²³ λ‚˜μ—΄ μˆœμ„œλŠ” λ‹€λ₯΄μ§€λ§Œ κ·Έ ꡬ성(μ•ŒνŒŒλ²³κ³Ό κ·Έ 개수)이 일치
  // 길이가 λ‹€λ₯Έ 두 개의 단어가 주어지면, κ·Έ 두 단어가 μ•„λ‚˜κ·Έλž¨μΈμ§€ νŒλ³„
  // λŒ€μ†Œλ¬Έμž ꡬ별

  let answer = "Yes";

  // map1 을 κΈ°μ€€ 객체둜 λ§Œλ“€μ–΄ 놓고 
  // map1 κ³Ό word2λ₯Ό λΉ„κ΅ν•΄μ„œ keyκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ 보고, 있으면 value 비ꡐ
  let map1 = new Map();

  for (let x of word1) {
    if (map1.has(x)) {
      map1.set(x, map1.get(x) + 1);
    } else {
      map1.set(x, 1);
    }
  }

  for (let x of word2) {
    if (!map1.has(x) || map1.get(x) === 0) {
      return "No";
    }
    map1.set(x, map1.get(x) - 1);
  }

  return answer;
}

const word1 = "abaCC";
const word2 = "Caaab";
console.log(solution(word1, word2));

 

 

+ Recent posts