๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์ž๋ฃŒ๊ตฌ์กฐ

1. ์ž๋ฃŒ๊ตฌ์กฐ๋ž€?

by ๐Ÿณ Laboon 2024. 1. 26.
Data Structure

์ปดํ“จํ„ฐ๋Š” Data์˜ ์ง‘ํ•ฉ์ฒด์ž…๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ์—์„œ Data๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ฃ ?

์‹ค์ œ๋กœ ์‚ฌ๋žŒ์ด ์ƒ๊ฐํ•˜๊ธฐ์— ์ง๊ด€์ ์ด๊ฑฐ๋‚˜ ์ˆ˜ํ•™์ , ๋…ผ๋ฆฌ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๊ณ ๋ฅผ ์ปดํ“จํ„ฐ์˜ ์ž…์žฅ์—์„œ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ปดํ“จํ„ฐ๋Š” ์‚ฌ๋žŒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐ์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก '๋ช…๋ น'์„ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

How ? 

 

์–ด๋–ป๊ฒŒ ์ปดํ“จํ„ฐ์—๊ฒŒ ๋ช…๋ น์„ ํ•ด์•ผ ํ• ๊นŒ์š”?

๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํ“จํ„ฐ๋Š” ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ  ์ž…, ์ถœ๋ ฅ์„ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ, 1, 2, 3, 4, 5, 7 ์ด ์žˆ์„ ๋•Œ '6'์„ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๊ฒฐ๊ณผ๋ฅผ 1 2 3 4 5 6 7๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

 

๋ฐฉ๋ฒ•์€ ๋ฌด์ˆ˜ํžˆ ๋งŽ์€๋ฐ์š”.

vector<int> arr = {1, 2, 3, 4, 5, 7};
int now = 6;

for (int index = 0; index < arr.size(); index++) {
    int key = arr[index];
    if (key > now) {
    	arr[index] = now;
        now = key;
    }
}

 

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.

๋‹จ์ˆœํ•œ ๋…ผ๋ฆฌ๋กœ๋Š” ํ˜„์žฌ ๊ฐ’์ด key ๊ฐ’๋ณด๋‹ค ํด ๊ฒฝ์šฐ, ์‚ฝ์ž…ํ•˜๊ณ  ํ˜„์žฌ๊ฐ’์„ key ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

(1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (7, 6)์„ ๋น„๊ตํ•˜๋‹ค๊ฐ€ 7 > 6์ธ ์‹œ์ ์—์„œ arr์€ {1, 2, 3, 4, 5, 6}์ด ๋˜๊ณ  now๋Š” 7์ด ๋ฉ๋‹ˆ๋‹ค.

์–ด ? 7์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†์ง€ ์•Š๋‚˜์š”?

vector<int> arr = {1, 2, 3, 4, 5, 7};
int now = 6;

for (int index = 0; index < arr.size(); index++) {
    int key = arr[index];
    if (key > now) {
    	arr[index] = now;
        now = key;
    }
}

arr.push_back(now);

 

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋งˆ์ง€๋ง‰์— push_back์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด ๋‚˜๋ณด๋‹ค ํฐ ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ, ๋‹น์—ฐํžˆ ๋งจ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทผ๋ฐ, ์ฒ˜์Œ๋ถ€ํ„ฐ key๊ฐ’์ด now๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

์œ„ ์ฝ”๋“œ์—์„œ now๋ฅผ 0์ด๋ผ๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ์ง์ ‘ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋ฌธ์ œ์—†์ด ์ž˜ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! 

 

์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ์ˆซ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ์ƒ๊ฐํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ๋งŽ์Šต๋‹ˆ๋‹ค..

์šฐ๋ฆฌ๋Š” ๋งค๋ฒˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์ด๋ ‡๊ฒŒ ๋งŽ์€ ๋ถ€๋ถ„๊นŒ์ง€ ์ƒ๊ฐํ•ด์•ผํ• ๊นŒ์š”?? (์ •๋‹ต)

์ด ๋งŽ์€ ๋ถ€๋ถ„์„ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

 

์œ„์˜ ์ฝ”๋“œ๋Š” ํ•˜๋‚˜์˜ ์ „์ œ ์กฐ๊ฑด์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „์— ๋ฏธ๋ฆฌ '์ •๋ ฌ'๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” ๋งค๋ฒˆ ์ •๋ ฌ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด์•ผํ• ๊นŒ์š”..?

์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๊ฐ€ ๋”ฐ๋กœ ์ •๋ ฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ •๋ ฌ์ด ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ ์™ธ, ํ˜„์‹ค์„ธ๊ณ„์—์„œ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์ง€๋„, ์‚ฌ๋žŒ๊ฐ„์˜ ๊ด€๊ณ„, ์ปดํ“จํ„ฐ์˜ ๋™์ž‘ ๋“ฑ....

์šฐ๋ฆฌ๊ฐ€ ์ปดํ“จํ„ฐ์— ๋ช…๋ นํ•  ๋•Œ ์ปดํ”‚ํ„ฐ๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ธ๊ฐ„์˜ ๋ฒˆ๊ฑฐ๋กœ์›€๋„ ์ค„์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

 

์ปดํ“จํ„ฐ ์–ธ์–ด๋ฅผ ์ ‘ํ•ด๋ดค๋‹ค๋ฉด `์ด๊ฒƒ๋“ค๋กœ ์–ด๋–ป๊ฒŒ ์›น ์‚ฌ์ดํŠธ, ์•ฑ, ๊ฒŒ์ž„ ๋“ฑ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ ์ผ๊นŒ?`

ํ•œ ๋ฒˆ์ด๋ผ๋„ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ•ด๋ดค๋‹ค๋ฉด ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต๊ฒŒ ๋А๊ปด์ง€์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊นŠ์ด ๊ณต๋ถ€ํ• ์ˆ˜๋ก ์–ด๋ ค์šด ๊ฒƒ์€ ๋‹น์—ฐํ•˜๋‚˜ ์ผ์ •ํ•œ ์ˆ˜์ค€๊นŒ์ง€๋Š” ์–ด๋ ต๊ธฐ ํž˜๋“ค๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค.


์ €๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ, `์•„ ์ด๊ฒŒ ์ด๋ ‡๊ฒŒ ์—ฎ์ด๊ตฌ๋‚˜~` ๋ฅผ ๊ณ„์† ์ƒ๊ฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

 

์ž๋ฃŒ๊ตฌ์กฐ์˜ ์‹œ์ž‘์„ ์ž‘์„ฑํ•˜๋Š” ๊ธ€์ธ๋ฐ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋„ˆ๋ฌด ๋‘๋ฃจ๋ญ‰์ˆ ํ•œ ๊ธ€์ด๋„ค์š”.

์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ, ๊ฐ€์žฅ ํ•„์š”ํ•œ ๊ฒƒ์ด '์–ด๋””์— ์‚ฌ์šฉ๋˜๋А๋ƒ?', '์™œ ์‚ฌ์šฉ๋˜๋А๋ƒ?', '์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋А๋ƒ?'

์œ„ ์„ธ๊ฐ€์ง€๊ฐ€ ํ•ต์‹ฌ์ธ ๊ฒƒ ๊ฐ™์•„์„œ ๋งŽ์€ ๋‚ด์šฉ์„ ์ œ์™ธํ•˜๊ณ  ์ž‘์„ฑํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

 

์ž๋ฃŒ ๊ตฌ์กฐ์˜ ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ์ฒ˜

 

์ž๋ฃŒ ๊ตฌ์กฐ์˜ ์ข…๋ฅ˜๋Š” ์ •๋ง ๋งŽ์Šต๋‹ˆ๋‹ค. ๋งŽ๋‹ค๋ณด๋‹ˆ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋„ ๋งŽ์€๋ฐ์š”.

๋Œ€ํ•™ ๋™๊ธฐ๋“ค ์ค‘์—์„œ๋„ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌ๋ถ„์„ ์ œ๋Œ€๋กœ ๋ชปํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋„ ๋งŽ๋”๊ตฐ์š”.

๋ณดํ†ต ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ import ํ•ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋“ค์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

C++์˜ ๊ฒฝ์šฐ, STL์— ํฌํ•จ๋œ set, queue, unordered_map ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

STL๊ณผ ๊ฐ™์ด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ '์–ด๋– ํ•œ' ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“  ์ž๋ฃŒ๊ตฌ์กฐ ๋˜ํ•œ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ž๋ฃŒ๊ตฌ์กฐ ์ข…๋ฅ˜

 

๋ฐฐ์—ด, ์Šคํƒ, ํ(๋ฑ), ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ํž™(์šฐ์„ ์ˆœ์œ„ ํ), ํ•ด์‹œํ…Œ์ด๋ธ”, ํŠธ๋ฆฌ (์ด์ง„ ํƒ์ƒ‰ํŠธ๋ฆฌ, ๊ท ํ˜•์ด์ง„ ํŠธ๋ฆฌ, ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ), ๊ทธ๋ž˜ํ”„ (์ธ์ ‘ํ–‰๋ ฌ, ์ธ์ ‘๋ฆฌ์ŠคํŠธ, Disjoint Set), ํŠธ๋ผ์ด

 

์‚ฌ์šฉ์ฒ˜

 

๊ฐ ๊ฐ์˜ ์‚ฌ์šฉ์ฒ˜๋Š” ์ •๋ง ๋งŽ์€๋ฐ์š”.

์šด์˜์ฒด์ œ, ๋„คํŠธ์›Œํฌ๋งŒ ํ•ด๋„ ์šฐ์„ ์ˆœ์œ„ ํ and ํ and ๊ทธ๋ž˜ํ”„ and ๋ฐฐ์—ด and ํ•ด์‹œํ…Œ์ด๋ธ”, ... ๋“ฑ

์•ž์œผ๋กœ ์ž‘์„ฑํ•  ํฌ์ŠคํŒ…์—์„œ ์ž๋ฃŒ๊ตฌ์กฐ์— ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ์ง€๋„ ํ•œ ๋ฒˆ ์ƒ๊ฐํ•ด์„œ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.