๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Code Tree

[์ฝ”๋“œํŠธ๋ฆฌ] Hash Map

SW์ค‘์‹ฌ๋Œ€ํ•™ ์‚ฌ์—…๋‹จ์—์„œ CodeTree์™€ ํ•จ๊ป˜ ์‹ค์‹œํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„ ์บ ํ”„์— ์ฐธ์—ฌํ•˜์—ฌ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

* ์ฐธ๊ณ  : python๊ณผ c++, java ๋“ฑ ์–ธ์–ด๋ณ„๋กœ ์„ค๋ช…์ด ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค! ํ•„์ž๋Š” c++์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

xxilliant ์ œ์ž‘

unordered_map STL

C++์—์„œ๋Š” unordered_map์ด๋ผ๋Š” STL์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

unordered_map์€ HashMap ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, HashMap์˜ ๊ฒฝ์šฐ ํ•ด์‹ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ž…๋‹ˆ๋‹ค. HashMap์€ (key, value) ์Œ ํ˜•ํƒœ๋กœ ๋“ค์–ด๊ฐ€ ์žˆ์–ด, key์™€ ๊ทธ์— ๋”ฐ๋ฅธ value ๊ฐ’์„ ๋™์‹œ์— ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ HashMap์˜ ์‚ฝ์ž…, ์‚ญ์ œ, ํƒ์ƒ‰ ๋“ฑ ๋ชจ๋“  ํ•จ์ˆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ „๋ถ€ ์ž…๋‹ˆ๋‹ค.

 

unordered_map์€ map๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ, ๊ฐ’ ์ž์ฒด์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ์ง€ ๊ทธ ์ˆœ์„œ์—๋Š” ์ „ํ˜€ ๊ด€์‹ฌ์ด ์—†๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

#include <unordered_map> ํ—ค๋”์™€, unordered_map<K, V> name; ํ˜•ํƒœ์˜ ์„ ์–ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

(K๋Š” key, V๋Š” value ์ž…๋‹ˆ๋‹ค.)

unordered_map์€ ์›๋ž˜ std::unordered_map์ด์ง€๋งŒ

using namespace std; ๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•œ ์ƒํƒœ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

์ •์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•  unordered_map์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

#include <iostream>
#include <unordered_map>

using namespace std;

int main() {
    unordered_map<int, int> m;
    return 0;
}
 

unordered_map์„ ์ด์šฉํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ 3๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค. unordered_map<int, int> m;๋กœ ์„ ์–ธ๋˜์–ด ์‚ฌ์šฉ๋  ๋•Œ๋ฅผ ์˜ˆ๋กœ ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. m.insert({K, V}) ํ˜น์€ m[K] = V

hashmap์— ์Œ(K, V)๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ๋ฐฐ์—ด์— ๊ฐ’์„ ๋„ฃ๋“ฏ์ด m[K] = V ๋ฐฉ์‹์œผ๋กœ๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋” ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  1. m.erase(K)

ํ˜„์žฌ hashmap์— ๋“ค์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ค‘ key๊ฐ€ K์ธ ์Œ์„ ์ฐพ์•„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  1. m.find(K) ํ˜น์€ m[K]

ํ˜„์žฌ hashmap์— key๊ฐ€ K์ธ ์Œ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. m.find(K) ์ด์šฉ์‹œ ๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น iterator๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์—†๋‹ค๋ฉด m.end()๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด m.find(K) != m.end(), ์—†๋‹ค๋ฉด m.find(K) == m.end()๋ฅผ ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ, ์›์†Œ๋Š” pair ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cout << (m.find(K))->first << endl;     // key๊ฐ€ K์ธ ์›์†Œ์˜ key ์กฐํšŒ
cout << (m.find(K))->second << endl;    // key๊ฐ€ K์ธ ์›์†Œ์˜ value ์กฐํšŒ
cout << (*m.find(K)).first << endl;     // key๊ฐ€ K์ธ ์›์†Œ์˜ key ์กฐํšŒ
cout << (*m.find(K)).second << endl;    // key๊ฐ€ K์ธ ์›์†Œ์˜ value ์กฐํšŒ
 

๋‹จ, ๊ฐ’๋งŒ ์กฐํšŒํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๋ผ๋ฉด ๋ฐฐ์—ด์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๊ฐ’์— ์ ‘๊ทผํ•˜๋“ฏ์ด m[K] ํ˜•ํƒœ๋กœ๋„ ์ด์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

cout << m[K] << endl;                   // key๊ฐ€ K์ธ ์›์†Œ์˜ value ์กฐํšŒ

 

 

Side Note

๋งŒ์•ฝ key๊ฐ€ ๋ฌธ์ž์—ด์ด๋ผ๋ฉด, ๋งˆ์น˜ ๋ฐฐ์—ด index๊ฐ€ ๋ฌธ์ž์—ด์ด ๋œ ๊ฒƒ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!

unordered_map<string, int> ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

#include <iostream>
#include <unordered_map>

using namespace std;

int main() {
    unordered_map<string, int> m;
    m["banana"] = 6;
    m["helloworld"] = 2;
    m["apple"] = 5;

    cout << m["banana"] << endl; // key๊ฐ€ banana์ธ ์Œ์˜ value ์ถœ๋ ฅ (6)
}

 

์ถœ์ฒ˜ ์ฝ”๋“œํŠธ๋ฆฌ