[Session] [Data Structure] 02. Set, Dictionary, Hash

Danbi Choยท2020๋…„ 4์›” 15์ผ
0

Session

๋ชฉ๋ก ๋ณด๊ธฐ
4/9

๐Ÿ“Œ What You Will Learn
โœ”๏ธData Structure์˜ ๊ฐœ๋… ํ•„์š”์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ดํ•ดํ•œ๋‹ค.
โœ”๏ธSet์˜ ๊ฐœ๋…๊ณผ ์žฅ์ , ๋‹จ์ , ๊ทธ๋ฆฌ๊ณ  ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€์ง€ ์ดํ•ดํ•œ๋‹ค.
โœ”๏ธDictionary์˜ ๊ฐœ๋…๊ณผ ์ƒ์„ฑ๋ฐฉ๋ฒ• ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•˜๋Š”์ง€์ดํ•ดํ•œ๋‹ค.

Set

Set์€ array๋‚˜ list์ฒ˜๋Ÿผ ์ˆœ์—ด ์ž๋ฃŒ๊ตฌ์กฐ(collection)์ด๋‹ค.
ํ•˜์ง€๋งŒ set์€ ์ˆœ์„œ ๊ฐœ๋…์ด ์กด์žฌ ํ•˜์ง€ ์•Š๋‹ค.

Set์˜ ํŠน์ง•

  • Array์™€ ๋‹ฌ๋ฆฌ set์€ ์š”์†Œ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Set์—์„œ ์š”์†Œ๋“ค์ด ์ €์žฅ๋  ๋•Œ ์ˆœ์„œ๋Š”
    1. ์ €์žฅํ•  ์š”์†Œ์˜ ๊ฐ’์˜ hash ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
    2. ํ•ด์‰ฌ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๊ณต๊ฐ„(bucket)์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ set์€ ์ €์žฅํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์˜ ํ•ด์‰ฌ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” bucket์— ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ๊ฐ€ ์—†๋‹ค. ์ˆœ์„œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— indexing๋„ ์—†๋‹ค.
  • ํ•ด์‰ฌ๊ฐ’ ๊ธฐ๋ฐ˜์˜ bucket์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต๋œ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ•ด์‰ฌ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— look up์ด ๊ต‰์žฅํžˆ ๋น ๋ฅด๋‹ค.
    • Look up: ํŠน์ • ๊ฐ’์„ ํฌํ•จํ•™ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธ ํ•˜๋Š” ๊ฒƒ => 5 in my_set
    • Set์˜ ์ด ๊ธธ์ด์™€ ์ƒ๊ด€์—†์ด ๋‹จ์ˆœํžˆ ํ•ด์‰ฌ๊ฐ’ ๊ณ„์‚ฐ ํ›„ ํ•ด๋‹น bucket์„ ํ™•์ธํ•˜๋ฉด ๋˜๋ฏ€๋กœ 0(1)

hash๋Š” ๋‹จ๋ฐฉํ–ฅ (one way) ์•”ํ˜ธํ™”.
๋‹จ๋ฐฉํ–ฅ์ด๋ž€ ํ•œ๋ฒˆ ์•”ํ˜ธํ™” ํ•˜๋ฉด ๋ณตํ˜ธํ™”๊ฐ€ ์•ˆ ๋œ๋‹ค๋Š” ๋œป.
์‹ค์ œ ๊ฐ’์˜ ๊ธธ์ด์™€ ์ƒ๊ด€์—†์ด hash ๊ฐ’์€ ์ผ์ •ํ•œ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„๋‹ค. Hash๋Š” ์ฃผ๋กœ ์ž„์˜์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ์ž„์˜์ด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

When To Use Set

  • ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ณจ๋ผ๋‚ด์•ผ ํ• ๋•Œ
  • ๋น ๋ฅธ look up์„ ํ•ด์•ผ ํ• ๋•Œ
  • ๊ทธ๋Ÿฌ๋ฉด์„œ ์ˆœ์„œ๋Š” ์ƒ๊ด€ ์—†์„๋•Œ

Set ์‹ค์Šต

let mySet = new Set(['wecode', 'wework', 'wecode']);
// Set { 'wecode', 'wework' } wecode ์ค‘๋ณต

mySet.add('wecode'); // Set { 'wecode', 'wework' } wecode ์ค‘๋ณต
mySet.add('wework'); // Set { 'wecode', 'wework' } wework ์ค‘๋ณต
mySet.add('weplay'); // Set { 'wecode', 'wework', 'weplay' } weplay ์ถ”๊ฐ€

mySet.forEach((value) => {
  console.log(value);
});
// 'wecode'
// 'wework'
// 'weplay'
  • set์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์˜ ์ค‘๋ณต ํ•ญ๋ชฉ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋ฐฐ์—ด๋“ค๋กœ ๋ถ€ํ„ฐ ์œ ์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ฐฐ์—ด์„ ์žฌ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.
function isDuplicated(arr) {
  var mySet = new Set(arr);
  return mySet.size < arr.length;
}

console.log(isDuplicated([1, 1, 2, 3])); // true
console.log(isDuplicated([1, 2, 3])); // false

function uniqueElements(list1, list2) {
  var mySet = new Set(list1.concat(list2));
  return Array.from(mySet);
}

console.log(uniqueElements([1, 2, 4, 5], [ 2, 3, 5, 6]));
// [1, 2, 4, 5, 3, 6]

Dictionary

๋”•์…”๋„ˆ๋ฆฌ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

// dictionary create 1
let dictionary1 = {"name":["Ryan", "Lee"], 
                   "job":"sw engineer", 
                   "address": {"city":"seoul", "zip_code":"1234"} } 

console.log(dictionary1.name[1]); // Lee
console.log(dictionary1.address.city); // seoul
console.log(dictionary1.address.zip_code); // 1234
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ์–ด์ง€๊ฑฐ๋‚˜ ๋”•์…”๋„ˆ๋ฆฌ์˜ ๋‚ด์šฉ์ด ๊ณ ์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•
// dictionary create 2
let dictionary2 = {}
dictionary2["name"] = ["Ryan", "Lee"]
dictionary2["job"] = "sw engineer"
dictionary2["address"] = {"city":"seoul", "zip_code":"1234"}

console.log(dictionary2.name[1]); // Lee
console.log(dictionary2.address.city); // seoul
console.log(dictionary2.address.zip_code); // 1234
  • dictionary2 ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด๋†“๊ณ  ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•ด์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋™์ ์œผ๋กœ ์ฑ„์›Œ์•ผํ•  ๋•Œ ํŽธํ•œ ๋ฐฉ๋ฒ•
// dictionary create 3
let dictionary3 = Object({ "name":["Ryan","Lee"], "job":"sw engineer",
                           "address":{"city":"seoul","zip_code":"1234"} });

console.log(dictionary3.name[1]); // Lee
console.log(dictionary3.address.city); // seoul
console.log(dictionary3.address.zip_code); // 1234
  • ์ˆซ์ž๋กœ ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฌธ์ž์—ด๋งŒ ํ‚ค๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

Hash ์‹ค์Šต

ํ•ด์‹œ๋Š” ๋‹จ๋ฐฉํ–ฅ(one way) ์•”ํ˜ธํ™”. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์›๋ณธ ๋ฐ์ดํ„ฐ๋กœ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. SHA(๋ณด์•ˆ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜)์„ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค. SHA ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ ํ•ด์‹œ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

var crypto = require('crypto')
var shasum = crypto.createHash('sha1')
shasum.update('wecode')
var hash_value = shasum.digest('hex')
console.log(hash_value);
console.log(hash_value.length);

var shasum2 = crypto.createHash('sha1')
shasum2.update('1234')
var hash_value_1234 = shasum2.digest('hex')
console.log(hash_value_1234);
console.log(hash_value_1234.length);

/* ๊ฒฐ๊ณผ
Hash {
  _options: undefined,
  writable: true,
  readable: true,
  [Symbol(kHandle)]: {},
  [Symbol(kState)]: { [Symbol(kFinalized)]: false }
}
'283463014a3f8ab829fcf9087ff85d50da1d1bb6'
Hash {
  _options: undefined,
  writable: true,
  readable: true,
  [Symbol(kHandle)]: {},
  [Symbol(kState)]: { [Symbol(kFinalized)]: false }
}
40
'7110eda4d09e062aa5e4a390b0a572ac0d2c0220'
40
*/

์ด์ฒ˜๋Ÿผ hash ๊ฐ’์€ ์ผ์ •ํ•œ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๊ณ , ์ฃผ๋กœ ์ž„์˜์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ์ž„์˜์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

ํ•ด์‹œํ•จ์ˆ˜๋Š” ๊ฐ™์€ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ™์€ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด์‹œํ•จ์ˆ˜๋กœ ๊ตฌํ•œ ๋ฒ„ํ‚ท์˜ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅ ํ›„์—๋„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

profile
๋ฃฐ๋ฃจ๋ž„๋ผ! ๊ฐœ๋ฐœ์ž ๋˜๊ณ  ์‹ถ์–ด์š”๐Ÿ™ˆ

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