Skip to content

bbeomgeun/Algorithm-cpp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

341 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

C++ - ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€

์‹œ๊ฐ„๋ณต์žก๋„ & ๊ณต๊ฐ„๋ณต์žก๋„

  1. vector vs queue ์†๋„ ๋น„๊ต
count / time(ms) 10000 20000 30000 40000
vector 202.271 804.508 1807.05 3209.99
list 3.057 5.459 7.868 10.524
queue 2.356 4.6 6.837 9.099
  • ๋ฐฐ์—ด๊ธฐ๋ฐ˜์ธ vector๋Š” ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ์‹œ ์ธ๋ฑ์Šค ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ O(n)๋งŒํผ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.(์•ž ์š”์†Œ ์‚ญ์ œ์‹œ ๋ชจ๋‘ ํ•œ์นธ ์”ฉ ์›€์ง์ธ๋‹ค)
  • ํ•˜์ง€๋งŒ, ์ž„์˜ ์ ‘๊ทผ์€ ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.
  • ์†๋„ ์ฐจ์ด๋Š” ์œ„์˜ ํ‘œ์™€ ๊ฐ™์ด ๊ฝค ๋งŽ์ด ์ฐจ์ด๋‚œ๋‹ค.

์ถœ์ฒ˜ : https://blog.naver.com/omg92/60148996317


Dynamic Programming(๋™์ ๊ณ„ํš๋ฒ•)

  • ํฐ ๋ฌธ์ œ์˜ ํ•ด๋‹ต์— ๊ทธ๋ณด๋‹ค ์ž‘์€ ๋ฌธ์ œ์˜ ํ•ด๋‹ต์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ(Optimal SubStructure๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•œ๋‹ค. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ถ˜ ๋ฌธ์ œ์˜ ์˜ˆ๋กœ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด๋‹ค.
  • n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” An = An-1 + An-2์™€ ๊ฐ™์ด ๊ตฌํ•ด์ง€๋ฏ€๋กœ, ํฐ ๋ฌธ์ œ An์— ์ž‘์€ ๋ฌธ์ œ An-2๊ณผ An-1์ด ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ์ค‘๋ณตํ˜ธ์ถœ๋กœ ์ธํ•ด ๋งค์šฐ ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ์ง„ํ–‰์ด ๋œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์–ด๋ ค์›€์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๋“ฏ ํ•˜๋‹ค.
  1. ์ฃผ์–ด์ง„ ๋ฌธ์ œ๊ฐ€ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
  2. ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ์—๋Š” ๋น„ํšจ์œจ์ ์ด๋‹ค.
  • ์ฆ‰, An์„ ๊ตฌํ• ๋•Œ ๋งค๋ฒˆ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘๊ณ , ๋งˆ์ง€๋ง‰ An-1๊ณผ An-2 ๋งŒ์„ ํ˜ธ์ถœํ•ด์„œ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization) ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜


Selection Sorting(์„ ํƒ์ •๋ ฌ)

  1. ์ฒซ๋ฒˆ์งธ ์ž๋ฆฌ ๊ฐ’์„ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.
  2. ๋‹ค์Œ ์ž๋ฆฌ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
  3. ๊ฒฐ๊ณผ๊ฐ’๊ณผ ์ฒซ๋ฒˆ์งธ ์ž๋ฆฌ์™€ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค.
  4. ๊ทธ ๋‹ค์Œ ์ž๋ฆฌ๊ฐ’์„ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ์ง€์ •ํ•˜๊ณ  1,2,3์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  void selectionSort(int *list, const int n)
{
    int i, j, indexMin, temp;

    for (i = 0; i < n - 1; i++)
    {
        indexMin = i;
        for (j = i + 1; j < n; j++)
        {
            if (list[j] < list[indexMin])
            {
                indexMin = j;
            }
        }
        temp = list[indexMin];
        list[indexMin] = list[i];
        list[i] = temp;
    }
}
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n^2)๋กœ ํšจ์œจ์ ์ธ ์ •๋ ฌ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.
  • (10๊ฐœ์˜ ์ˆ˜์ผ๊ฒฝ์šฐ ๋น„๊ตํ•˜๋Š” ํšŸ์ˆ˜๋Š” 10+9+8+...1์œผ๋กœ 10(1+10)/2 => n(n+1)/2๋กœ O(n^2)์ด๋‹ค.

Bubble Sorting(๋ฒ„๋ธ”์ •๋ ฌ)

  1. ์„ ํƒ์ •๋ ฌ๊ณผ ๋‹ฌ๋ฆฌ, ์ฒซ๋ฒˆ์งธ ์›์†Œ์™€ ๋‘๋ฒˆ์งธ ์›์†Œ๋ฅผ ๋น„๊ตํ•ด์„œ ํฐ ์ˆ˜๋ฅผ ๋‘๋ฒˆ์งธ ์ž๋ฆฌ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.
  2. ๋ ์›์†Œ๊นŒ์ง€ ์ˆœํšŒํ•˜๋ฉฐ ๊ณ„์†ํ•ด์„œ ์˜† ์ž๋ฆฌ ์ˆ˜์™€ ๋น„๊ตํ•˜๋ฉฐ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.
  3. ํ•œ ๋ฐ”ํ€ด ๋Œ๋ ธ์œผ๋ฉด, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฒซ ์›์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋‹ค์Œ ์›์†Œ์™€ ๋น„๊ตํ•˜๋ฉฐ ์ž๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค(์ด๋ฒˆ์—” n-1 ๊นŒ์ง€).
  4. ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋ฉฐ, ๋์ž๋ฆฌ์—๋Š” ์ฐจ๊ณก์ฐจ๊ณก ํฐ ์ˆ˜๊ฐ€ ์Œ“์ด๋ฏ€๋กœ ๋ฐ˜๋ณตํ• ๋•Œ๋งˆ๋‹ค ์ˆœํšŒํ•˜๋Š” ์ž๋ฆฌ ์ˆ˜๋ฅผ ํ•œ ์ž๋ฆฌ์”ฉ ์ค„์—ฌ์ค€๋‹ค.
void bubbleSort(int* list, const int n) {
  for (int i = 0; i < n; i++) {
  	for (int j = 0; j < n - i - 1; j++) {
  		if (list[j] > list[j + 1]) {
  			int temp = list[j];
  			list[j] = list[j + 1];
  			list[j + 1] = temp;
  		}
  	}
  }
}
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n^2)์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์„ ํƒ์ •๋ ฌ๋ณด๋‹ค ๋” ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค.
  • ์„ ํƒ์ •๋ ฌ์€ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•ด๋†“๊ณ  ๋งˆ์ง€๋ง‰์— ์œ„์น˜๋ฅผ ๋ฐ”๊พธ์ง€๋งŒ, ๋ฒ„๋ธ”์ •๋ ฌ์€ ๋งค๋ฒˆ ์˜† ์›์†Œ์™€ ๋น„๊ต ํ›„ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Insertion Sorting(์‚ฝ์ž…์ •๋ ฌ)

  1. ์‚ฝ์ž…์ •๋ ฌ์€ ์™ผ์ชฝ ๋ถ€๋ถ„์€ ์ •๋ ฌ๋˜์–ด์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋น„๊ต๋ฅผ ํ•œ๋‹ค.
  2. ์˜ค๋ฅธ์ชฝ ์›์†Œ์™€ ์™ผ์ชฝ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์™ผ์ชฝ ์›์†Œ๊ฐ€ ๋” ํฌ๋ฉด ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ๋‹ค.
  3. ๊ณ„์† ๋น„๊ต๋ฅผ ํ•˜๋‹ค๊ฐ€ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ€์‹œ ์ˆœํšŒ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ (์ด๋ฏธ ์™ผ์ชฝ์€ ์ •๋ ฌ๋˜์–ด์žˆ๊ธฐ์— ์กฐ๊ฑด๋ฌธ์— ์˜ํ•ด ๋ฐ˜๋ณต์ด ์ข…๋ฃŒ๋œ๋‹ค) ๋‹ค์‹œ ๋‹ค์Œ ์›์†Œ๋ถ€ํ„ฐ ๋น„๊ต๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.
void insertionSort(int* list, int N) {
	for (int i = 0; i < N-1 ; i++) {
		int j = i; // ์ˆœํšŒํ•˜๋Š” index j๋ฅผ i๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.
		while (j >= 0 && list[j] > list[j + 1]) { // j >=0 : ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์ •๋ ฌ๋ ์‹œ j--๊ฐ€ ๋˜๋ฏ€๋กœ j์˜ index๊ฐ€ -1์ด ๋˜๊ณ  ๋”๋ฏธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.
			int temp = list[j];
			list[j] = list[j + 1];
			list[j + 1] = temp;
			j--; // ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด์„œ while ์กฐ๊ฑด์ด false(์™ผ์ชฝ<์˜ค๋ฅธ์ชฝ)์ด ๋ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
		}
	}
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์„ ํƒ, ๋ฒ„๋ธ”์ •๋ ฌ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ O(n^2)์ด์ง€๋งŒ - (๋ฐ˜๋ณต๋ฌธ์ด ๋‘๋ฒˆ) ์‹ค์ œ๋กœ๋Š” ์„ ํƒ์ •๋ ฌ, ๋ฒ„๋ธ”์ •๋ ฌ๋ณด๋‹ค ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐฐ์—ด์ด ๊ฑฐ์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ, ์‚ฝ์ž…์ •๋ ฌ์€ ์ˆœํšŒ๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์„ ์•Œ๊ธฐ์— ํ›จ์‹  ํšจ์œจ์ ์œผ๋กœ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ•„์š”ํ• ๋•Œ๋งŒ ์‚ฝ์ž…์„ ํ•˜๊ธฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

Quick Sorting(ํ€ต์ •๋ ฌ)

  1. pivot์„ ์ •ํ•ด์„œ ์ผ๋ฐ˜์ ์œผ๋กœ pivot ๊ธฐ์ค€์œผ๋กœ ์ž‘์€ ๊ฐ’์€ ์™ผ์ชฝ, ํฐ ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ •๋ ฌ์„ ํ•ด์ค€๋‹ค.
  2. ์™ผ์ชฝ ์‹œ์ž‘์›์†Œ๋ฅผ start, ์˜ค๋ฅธ์ชฝ ๋๋…ธ๋“œ๋ฅผ end๋กœ ํ•ด์„œ start++ . end -- ํ•˜๋ฉด์„œ pivot๋ณด๋‹ค ํฐ๊ฐ’, ์ž‘์€๊ฐ’์„ ๊ฐ๊ฐ ์ฐพ์•„์„œ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค.
  3. ๊ณ„์†ํ•ด์„œ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋‹ค๊ฐ€ start์™€ end์˜ index๊ฐ€ ์„œ๋กœ ์—‡๊ฐˆ๋ฆด ๊ฒฝ์šฐ, end์˜ ๊ฐ’๊ณผ pivot์œผ๋กœ ์ •ํ•œ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.
  4. end์˜ index๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ์›์†Œ๋“ค๊ณผ ์˜ค๋ฅธ์ชฝ ์›์†Œ๋“ค์„ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋‚˜๋ˆ ์„œ ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. (์žฌ๊ท€ ํ˜ธ์ถœ)
void quicksort(int* list, int start, int end) {
	if (start >= end) {
		return; //์›์†Œ ํ•œ๊ฐœ์ผ๋•Œ ์žฌ๊ท€๋ฅผ ์ข…๋ฃŒ.
	}
	
	int i = start+1;
	int j = end;
	int pivot = start;

	while (i <= j) { // ์„œ๋กœ ์—‡๊ฐˆ๋ฆด๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต => ์ฐธ ์กฐ๊ฑด์€ ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€
		while (list[pivot] >= list[i] && i<=end) { // ํ‚ค๊ฐ’๋ณด๋‹ค ํฐ๊ฐ’์„ ์ฐพ์„๋•Œ : ์ฆ‰ ํ”ผ๋ด‡์ด ๊ณ„์† ํด ๋•Œ ์ฐธ๊ฐ’์ด๊ณ  ์ž‘์œผ๋ฉด ์ค‘๋‹จ => list[pivot]<=list[i]์ด ์ค‘๋‹จ์กฐ๊ฑด
			i++;
		}					   // i<=end ์กฐ๊ฑด์€ end๋ฅผ ๋ฒ—์–ด๋‚˜๊ธฐ์ „๊นŒ์ง€. (๋“ฑํ˜ธ ํฌํ•จ)
		while (list[pivot] <= list[j] && j > start) { // ์—ญ์‹œ ํ”ผ๋ด‡๊ฐ’๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต = ํ”ผ๋ด‡๊ฐ’๋ณด๋‹ค ํฐ ๊ฒƒ์ด ์ฐธ์กฐ๊ฑด =>list[pivot] >= list[j]๊ฐ€ ์ค‘๋‹จ์กฐ๊ฑด
			j--;
		}					   // i>start ์กฐ๊ฑด์€ start ์•ž๊นŒ์ง€ (start๋Š” pivot์ž๋ฆฌ์ด๋ฏ€๋กœ) (๋“ฑํ˜ธ ๋ฏธํฌํ•จ)
		if (i > j) { // ์—‡๊ฐˆ๋ ธ์„๋•Œ j(end)๊ฐ’๊ณผ pivot์„ ๋ฐ”๊ฟ”์ค€๋‹ค.
			int temp = list[j];
			list[j] = list[pivot];
			list[pivot] = temp;
		}
		else { // ์•„๋‹๊ฒฝ์šฐ i์™€ j์˜ ๊ฐ’์„ ๋ฐ”๊ฟ”์ค€๋‹ค.
			int temp = list[i];
			list[i] = list[j];
			list[j] = temp;
		}
	}
	// i์™€ j๊ฐ€ ๊ต์ฐจ๋ ๋•Œ pivot๊ณผ j์™€ ๊ฐ’์„ ๋ฐ”๊พธ๊ณ  j๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ• ์ •๋ ฌ๋œ๋‹ค.
	quicksort(list, start, j-1); // j๊ธฐ์ค€ ์™ผ์ชฝ ํŒŒํ‹ฐ์…˜
	quicksort(list, j+1, end); // j๊ธฐ์ค€ ์˜ค๋ฅธ์ชฝ ํŒŒํ‹ฐ์…˜
}
  • ํ€ต์ •๋ ฌ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ํ‰๊ท ์ ์œผ๋กœ O(nLogn)์ด๋‹ค.
  • ๋ถ„ํ• ์ •๋ณต+์žฌ๊ท€ํ˜ธ์ถœ์œผ๋กœ n๋ฒˆ ํƒ์ƒ‰ํ•˜๋ฉฐ ๋ฐ˜์œผ๋กœ ์ชผ๊ฐœ์„œ ๊นŠ์ด(logn)๊ฐ€ ์ •ํ•ด์ง€๋ฏ€๋กœ n * logn์ด๋‹ค.
  • ์ตœ์•…์€ O(n^2)๋กœ ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ํ€ต์ •๋ ฌ ํ•  ๊ฒฝ์šฐ ๋งค๋ฒˆ n๋ฒˆ ํƒ์ƒ‰ * n๋ฒˆ ํ˜ธ์ถœ๊นŠ์ด(ํšŸ์ˆ˜)๋กœ n * n์ด ๋œ๋‹ค. (๋ถˆ๊ท ํ˜• ๋ถ„ํ• ์ด ๋œ๋‹ค.)
  • ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์œ„์˜ ์„ ํƒ, ๋ฒ„๋ธ”, ์‚ฝ์ž… ์ •๋ ฌ๊ณผ ๋น„๊ตํ•ด์„œ ์„ฑ๋Šฅ์ด ๋น ๋ฅด๋‹ค.
  • while๋ฌธ ์•ˆ์˜ while ๋‘๊ฐœ์—์„œ ์กฐ๊ฑด์˜ ๋ถ€๋“ฑํ˜ธ๋ฅผ ๊ฐ์ž ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • list[pivot] <= list[i] ์™€ list[pivot] >= list[j] ์œผ๋กœ ๋ถ€๋“ฑํ˜ธ๋ฐฉํ–ฅ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค. (๊ทธ๋Ÿฌ๋ฉด ์™ผ์ชฝ์—” ํฐ ๊ฐ’, ์˜ค๋ฅธ์ชฝ์—” ์ž‘์€ ๊ฐ’์ด ์ •๋ ฌ)

Merge Sorting(๋ณ‘ํ•ฉ์ •๋ ฌ)

  1. ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถ„ํ• ์ •๋ณต ๋ฐฉ์„ ์ฑ„ํƒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  2. ํ€ต ์ •๋ ฌ์€ ํ”ผ๋ด‡๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์ง€๋งŒ, ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ํ•ญ์ƒ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ํŠน์ง•(์ด๊ฒƒ์ด logN์„ ๋งŒ๋“ ๋‹ค).
  3. ๋ฆฌ์ŠคํŠธ๋ฅผ ์›์†Œ ๋‹จ์œ„๋กœ ๋ชจ๋‘ ๋‚˜๋ˆˆ ๋‹ค์Œ์—, ๋ณ‘ํ•ฉํ•˜๋ฉด์„œ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋งŒ๋“ค๊ณ , ๊ทธ ์ง‘ํ•ฉ์„ ๋˜ ๋ณ‘ํ•ฉํ•œ๋‹ค.
  4. ๋ณ‘ํ•ฉ์„ ์ง„ํ–‰ํ•  ๋•Œ, ๋ถ€๋ถ„ ์ง‘ํ•ฉ์€ ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ๋กœ ๊ฐ€์ •ํ•œ๋‹ค.
  5. ์ฆ‰, ์ง‘ํ•ฉ์„ ๋ฐ˜์”ฉ ๋‚˜๋ˆ ์„œ ์›์†Œ ๋‹จ์œ„๋กœ ๋‚˜๋ˆˆ ๋‹ค์Œ ํ•ฉ์น˜๋Š” ์ˆœ๊ฐ„์— ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋‚˜์•„๊ฐ„๋‹ค.
int sorted[8]; // ์ •๋ ฌ๋œ ์›์†Œ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด์€ ํ•ญ์ƒ ์ „์—ญ๋ณ€์ˆ˜๋ฅด ์ €์žฅํ•ด์ฃผ์ž.
void merge(int* list, int start, int middle, int end) {
   int i = start;
   int j = middle + 1;
   int k = start;
   while (i<=middle && j <=end) { 
   // ์ฐธ์กฐ๊ฑด์€ ๋‘ index๊ฐ€ ๋ชจ๋‘ ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜์„๋•Œ /  i๊ฐ€ middle๊นŒ์ง€๊ฐ€๊ฑฐ๋‚˜ j๊ฐ€ end๊นŒ์ง€ ๊ฐ€๊ฑฐ๋‚˜(false ์กฐ๊ฑด)
   	if (list[i] <= list[j]) { 
   	// ๋ธ”๋Ÿญ ์ธ๋ฑ์Šค๋ผ๋ฆฌ ๋น„๊ตํ•ด์„œ sorted array์— ์ž‘์€ ์ˆ˜๋ถ€ํ„ฐ ๋„ฃ์–ด์ค€๋‹ค.
   		sorted[k] = list[i];
   		i++;
   	} 
   	else {
   		sorted[k] = list[j];
   		j++;
   	}
   	k++; //sorted array์˜ ์ธ๋ฑ์Šค k๋ฅผ ํ•œ์นธ์”ฉ ์˜ฎ๊ฒจ์ฃผ๋ฉด์„œ ์ง„ํ–‰
   }
   // ๋‚จ์€ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
   if (i  > middle) { 
   //์•ž ๋ธ”๋Ÿญ์ด ๋จผ์ € sorted array์— ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ๋’ท ๋ธ”๋Ÿญ์˜ ์ธ๋ฑ์Šค j๋ฅผ end๊นŒ์ง€ ์˜ฎ๊ฒจ์ฃผ๋ฉด์„œ ๋„ฃ์–ด์ค€๋‹ค.
   	for (int t = j; t <= end; t++) {
   		sorted[k] = list[t];
   		k++;
   	}
   }
   else { 
   // ์—ญ์‹œ ๋’ท๋ธ”๋Ÿญ์ด ๋จผ์ € sorted array์— ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ์•ž ๋ธ”๋Ÿญ์˜ ์ธ๋ฑ์Šค i๋ฅผ middle๊นŒ์ง€ ์˜ฎ๊ฒจ์ฃผ๋ฉด์„œ ๋„ฃ์–ด์ค€๋‹ค.
   	for (int t = i; t <= middle; t++) {
   		sorted[k] = list[t];
   		k++;
   	}
   }
   for (int t = start; t <= end; t++) {
   	list[t] = sorted[t];
   } // ์ •๋ ฌํ•œ(sorted array) ์ˆ˜๋ฅผ ๋‹ค์‹œ ์›๋ž˜ ๋ฐ์ดํ„ฐlist์— ๋„ฃ์–ด์ค€๋‹ค.
}

void mergeSort(int* list, int start, int end) {
   if (start < end) { // ํฌ๊ธฐ๊ฐ€ 1๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ mergeSort๋ฅผ ์ง„ํ–‰.
   	int middle = (start + end) / 2;
   	mergeSort(list, start, middle);
   	mergeSort(list, middle + 1, end);
   	merge(list, start, middle, end);
   } // ๊ณ„์†ํ•ด์„œ middle์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ  merge ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ๋ณ‘ํ•ฉ์„ ์ง„ํ–‰ํ•œ๋‹ค.
}
  • ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(nLogn)์ด๋‹ค.
  • ํ•ญ์ƒ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ์— nLogn์— ์ด๋ฏธ ์ •๋ ฌ์ด ๋˜์–ด ์žˆ๋Š” ๋‘ ๋ธ”๋Ÿญ์„ ํ•ฉ์น˜๋Š” ๊ฒƒ์€ o(N)์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ ํ€ต์ •๋ ฌ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(N^2)์ด์ง€๋งŒ ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ํ•ญ์ƒ O(nLogn)์„ ๋ณด์žฅํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ถ”๊ฐ€์ ์ธ ๋ฐฐ์—ด ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค ๋ผ๋Š” ์ ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํ™œ์šฉ์ด ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

Heap Sorting(ํž™ ์ •๋ ฌ)

  • ํž™์ด๋ž€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ผ์ข…์œผ๋กœ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์œ„ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’๋“ค ์ค‘์—์„œ ์ตœ๋Œ€๋‚˜ ์ตœ์†Œ๋ฅผ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ฐพ๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
  • ํž™์€ ์ผ์ข…์˜ ๋ฐ˜์ •๋ ฌ ์ƒํƒœ(partial order)๋ฅผ ์œ ์ง€ํ•œ๋‹ค. (ํฐ ๊ฐ’์ด ์ƒ์œ„ ๋ ˆ๋ฒจ, ์ž‘์€ ๊ฐ’์ด ํ•˜์œ„ ๋ ˆ๋ฒจ)
  • ํž™ ํŠธ๋ฆฌ์—์„œ๋Š” ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค. (์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์—์„œ๋Š” ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค)
ํž™์˜ ์ข…๋ฅ˜
  1. ์ตœ๋Œ€ ํž™
  • ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ
  • key(๋ถ€๋ชจ ๋…ธ๋“œ) >= key(์ž์‹ ๋…ธ๋“œ)
  1. ์ตœ์†Œ ํž™
  • ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ
  • key(๋ถ€๋ชจ ๋…ธ๋“œ) <= key(์ž์‹ ๋…ธ๋“œ)

ํž™์˜ ๊ตฌํ˜„
  • ํž™์„ ์ €์žฅํ•˜๋Š” ํ‘œ์ค€์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐฐ์—ด์ด๋‹ค.

  • ๊ตฌํ˜„์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋Š” 0์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • ์™ผ์ชฝ ์ž์‹ = ๋ถ€๋ชจ ๋…ธ๋“œ * 2 | ์˜ค๋ฅธ์ชฝ ์ž์‹ = ๋ถ€๋ชจ ๋…ธ๋“œ * 2 + 1 | ๋ถ€๋ชจ ๋…ธ๋“œ = ์ž์‹ / 2

  • STL ์‚ฌ์šฉ์‹œ

   #include <queue>
   priority_queue<์ž๋ฃŒํ˜•, container, ์˜ค๋ฆ„/๋‚ด๋ฆผ์ฐจ์ˆœ> ์ด๋ฆ„;
   priority_queue<int, <vector<int>, greater<int>> pq;

  ํ›„ push, top, empty ๋“ฑ ์—ฐ์‚ฐ ์ˆ˜ํ–‰
  

Stack(์Šคํƒ)

  • ์Šคํƒ์€ ํ•œ์ชฝ ์ž…๊ตฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋นผ๋Š” LIFO(LAST IN FIRST OUT)์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
  • ์ฆ‰, ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋œ๋‹ค.
  • C++์—์„œ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, STL #Include ์„ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Queue(ํ)

  • ํ๋Š” ์–‘์ชฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋บ„ ์ˆ˜ ์žˆ๋Š” FIFO(FIRST IN FIRST OUT)์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
  • ์ฆ‰, ๊ฐ€์žฅ ๋จผ์ € ๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋œ๋‹ค. (๋„ฃ์€ ์ˆœ์„œ๋Œ€๋กœ ์ œ๊ฑฐ๋œ๋‹ค)
  • C++์—์„œ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, STL #Include ๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์›ํ˜•ํ

  • ๋ฐฐ์—ด๋กœ ํ๋ฅผ ๊ตฌํ˜„ํ–ˆ์„๋•Œ, ์„ ํ˜•๋ฐฐ์—ด์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์‚ญ์ œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ์–ด๋А์ˆœ๊ฐ„ ํ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฝ‰ ์ฐผ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋œ๋‹ค. (์‹ค์ œ๋กœ๋Š” ์•ž์€ ๋น„์–ด์žˆ์Œ)
  • ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์˜ ์•ž๊ณผ ๋์„ ์ด์–ด์คŒ์œผ๋กœ, ์›ํ˜•์„ ์ด๋ค„์„œ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ์ดํ›„ ์ ‘๊ทผ์€ ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ ‘๊ทผํ•˜๊ฒŒ๋” ๊ตฌํ˜„์„ ํ•ด์ค€๋‹ค. (% ์—ฐ์‚ฐ ์ด์šฉ)
  • ๊ตฌํ˜„ ์›๋ฆฌ๋Š” front์™€ rear์€ index = 0์œผ๋กœ ํ•ด์ฃผ๊ณ , ํ•ญ์ƒ enqueue/ dequeue ์‹œ front์™€ rear์˜ ์ธ๋ฑ์Šค๋ฅผ 1 ๋Š˜๋ ค์ค€ ํ›„์— ์ˆ˜ํ–‰์„ ํ•œ๋‹ค.
  • ์›ํ˜•ํ๊ฐ€ full์ธ์ง€ ์•„๋‹Œ์ง€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•œ ์นธ์€ ํ•ญ์ƒ ๋น„์›Œ๋‘๊ณ , ๊ทธ๊ณณ์€ front๊ฐ€ ํ•ญ์ƒ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. (full์กฐ๊ฑด : (rear+1) % MAX_SIZE == front )
  • enqueue์‹œ rear = (rear+1) % MAX_SIZE ์„ ํ†ตํ•ด rear ํ•œ์นธ ์ด๋™ & % MAX_SIZE๋ฅผ ํ†ตํ•ด ์›ํ˜•์œผ๋กœ ๋ฐฐ์—ด์ ‘๊ทผ์„ ํ•˜๊ฒŒ๋” ๊ตฌํ˜„ํ•œ๋‹ค.
  • dequeue์‹œ front = (front+1) % MAX_SIZE ์„ ํ†ตํ•ด front ํ•œ์นธ ์ด๋™ & % MAX_SIZE๋ฅผ ํ†ตํ•ด ์›ํ˜•์œผ๋กœ ๋ฐฐ์—ด์ ‘๊ทผ์„ ํ•˜๊ฒŒ๋” ๊ตฌํ˜„ํ•œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด front๋Š” dequeue๋œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ ํ•ญ์ƒ front๋Š” ๋นˆ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰


BFS(Breadth First Search) ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰

  • ํƒ์ƒ‰์„ ํ•  ๋•Œ ๋„ˆ๋น„๋ฅผ ์šฐ์„ ์œผ๋กœ ํ•˜์—ฌ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • "๋งน๋ชฉ์ ์ธ ํƒ์ƒ‰"์„ ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํƒ์ƒ‰ ๊ธฐ๋ฒ•์œผ๋กœ "์ตœ๋‹จ ๊ฒฝ๋กœ"๋ฅผ ์ฐพ์•„์ค€๋‹ค๋Š” ์ ์—์„œ ์ตœ๋‹จ ๊ธธ์ด๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ(Queue) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • unweighted graph์— ๋Œ€ํ•ด ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์—๋„ ์ด์šฉํ•œ๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N+M) n์€ vertex, m์€ edge์˜ ๊ฐฏ์ˆ˜์ด๋‹ค.
  • BFS๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ queue์— ๋ชจ๋“  vertex๊ฐ€ ํ•œ๋ฒˆ์”ฉ enqueue, dequeue๊ฐ€ ๋จ์— ๋”ฐ๋ผ O(N)์˜ ์‹œ๊ฐ„์ด ์ถ”๊ฐ€๋˜๊ณ , enqueue๋œ vertex์— ์—ฐ๊ฒฐ๋œ neighbor๋“ค์„ ํ•œ๋ฒˆ์”ฉ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  vertex์— ๋Œ€ํ•ด ๊ฐ deg(v)์˜ ํ•ฉ์ด ๋œ๋‹ค. ์ด๊ฒƒ์€ 2xM์ด๊ณ  ๊ฒฐ๊ตญ์—” O(N+M)์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

vector<int> a[1001]; 
bool check[1001]; // ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์ธ์ง€ ํ™•์ธ

void bfs(int start) {
 queue<int> q;
 check[start] = true;
 q.push(start);

 while (!q.empty()) {
 	int node = q.front();
 	q.pop();

 	cout << node << " ";

 	for (int i = 0; i < a[node].size(); i++) {
 		int next = a[node][i];

 		if (check[next] == false) {
 			check[next] = true;
 			q.push(next);
 		}
 	}
 }
}

int main() {

 int n, m, start; // ๋…ธ๋“œ ๊ฐฏ์ˆ˜, ๊ฐ„์„  ๊ฐฏ์ˆ˜, ์‹œ์ž‘๋…ธ๋“œ
 cin >> n >> m >> start;

 for (int i = 0; i < m; i++) {
 	int u, v;
 	cin >> u >> v;

 	a[u].push_back(v); // u์™€ v๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
 	a[v].push_back(u);
 }

 for (int i = 1; i <= n; i++) // ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์„ ์ •๋ ฌํ•ด์ค€๋‹ค (1๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ 3, 5, 1์ด๋ผ๋ฉด 1, 3, 5๋กœ)
 	sort(a[i].begin(), a[i].end());

 bfs(start);

 return 0;
}

vector์— ๋Œ€ํ•œ ์ดํ•ด

  • a[i].push_back(k)๋Š” ๋ฒกํ„ฐ์š”์†Œ[i]์•ˆ์— ์ถ”๊ฐ€๋กœ [0],[1],[2]์ฒ˜๋Ÿผ ์ €์žฅํ•ด์ค€๋‹ค.
    ์ฆ‰ a[node].size()ํ•˜๋ฉด ์œ„์˜ ๊ฒฝ์šฐ 3์ด๊ณ  ๊ทธ ํšŸ์ˆ˜๋งŒํผ a[node][i] (a[node]์•ˆ์—์„œ index๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ vector์š”์†Œ ์•ˆ์˜ ๋ฐฐ์—ด์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด๋‹ค)
    ๊ฒฐ๊ณผ์ ์œผ๋กœ, ๊ทธ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค๋กœ ํ•ด์„๋˜์–ด์ง€๋ฉฐ bfs๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
  2. ์‹œ์ž‘ ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ true๋กœ ๋ฐ”๊พผ ํ›„, ์ฃผ๋ณ€ ๋…ธ๋“œ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ์ €์žฅ ํ›„ queue์—์„œ ๋นผ์ค€๋‹ค.
  3. ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์‹œ์ž‘ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•œ๋‹ค. (a[node].size()๋Š” ๊ทธ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์˜ ๊ฐฏ์ˆ˜๋งŒํผ)
  4. ๊ฐ๊ฐ ๋ฐฉ๋ฌธํ• ๋•Œ ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ์ฒดํฌ ํ›„ ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ, ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด queue์— ๋„ฃ์–ด์ฃผ๊ณ  ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ true๋กœ ๋ฐ”๊พผ๋‹ค.
  5. queue๊ฐ€ empty()๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์ค€๋‹ค.

์ถœ์ฒ˜ : https://twpower.github.io/73-how-to-implement-dfs-and-bfs-in-cpp


DFS(Depth First Search) ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰

  • ํƒ์ƒ‰์„ ํ•จ์— ์žˆ์–ด ๋ณด๋‹ค ๊นŠ์€ ๊ฒƒ์„ ์šฐ์„ ์ ์œผ๋กœ ํ•˜๋Š” ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ(Stack) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋˜๋Š” ์žฌ๊ท€ํ•จ์ˆ˜(Recursion)์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” DFS๋„ ์—ญ์‹œ O(N+M) n์€ vertex, m์€ edge์˜ ๊ฐฏ์ˆ˜์ด๋‹ค.
  • DFS๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ชจ๋“  vertex๊ฐ€ ํ•œ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋˜๊ณ  O(N)์˜ ์‹œ๊ฐ„์ด ์ถ”๊ฐ€๋˜๊ณ , vertex์— ์—ฐ๊ฒฐ๋œ neighbor๋“ค์„ ํ•œ๋ฒˆ์”ฉ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  vertex์— ๋Œ€ํ•ด ๊ฐ deg(v)์˜ ํ•ฉ์ด ๋œ๋‹ค. ์ด๊ฒƒ์€ 2xM์ด๊ณ  ๊ฒฐ๊ตญ์—” O(N+M)์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

vector<int> a[1001];
bool checked[1001];
int u, v;

void dfs(int node) {
 checked[node] = true;
 cout << node << " ";

 for (int i = 0;  i < a[node].size(); i++) {
 	int next = a[node][i];

 	if (checked[next] == false)
 		dfs(next);
 }

}

int main() {
 int n, m, start;
 cin >> n >> m >> start;

 for (int i = 0; i <m; i++) {
 	cin >> u >> v;
 	a[u].push_back(v);
 	a[v].push_back(u);
 }
 for (int i = 1; i <= n; i++)
 	sort(a[i].begin(), a[i].end());

 dfs(start);

 return 0;
}
  1. ๋…ธ๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์€ ํ›„, ์‹œ์ž‘๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์™„๋ฃŒ ํ›„ ์ถœ๋ ฅํ•ด์ค€๋‹ค.
  2. ์—ญ์‹œ a[node].size()๋งŒํผ ์ธ์ ‘๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋˜, ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด(false)์ด๋ฉด ์žฌ๊ท€ํ˜ธ์ถœํ•œ๋‹ค.
  3. ๊ทธ๋ ‡๊ฒŒ ๊นŠ์ด์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€, ์–ด๋А ํ•œ์ ์— ์—ฐ๊ฒฐ๋œ ์ธ์ ‘๋…ธ๋“œ๋“ค์ด ๋ชจ๋‘ ๋ฐฉ๋ฌธ์™„๋ฃŒ์ธ ์ƒํƒœ์ด๋ฉด ์žฌ๊ท€ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์”ฉ ์ข…๋ฃŒ๋˜๋ฉฐ ์ „ ๋…ธ๋“œ๋กœ ๋น ์ ธ๋‚˜์˜จ๋‹ค.
  4. ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๊นŠ์ด์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ณ  ๋น ์ ธ ๋‚˜์˜จ๋’ค์— ๋‹ค์Œ ๋…ธ๋“œ์˜ ๊นŠ์ด์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ถœ์ฒ˜ : https://twpower.github.io/73-how-to-implement-dfs-and-bfs-in-cpp


๋ฐฑ ํŠธ๋ž˜ํ‚น(Back Tracking)

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น์€ '๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ํƒ์ƒ‰ํ•œ๋‹ค'๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.
  • ๋Œ€ํ‘œ์ ์ธ ์™„์ „ ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” DFS๊ฐ€ ์žˆ๋Š”๋ฐ DFS๋Š” ํ˜„์žฌ ์ง€์ ์—์„œ ๋ฐฉ๋ฌธํ•  ๊ณณ์ด ์žˆ์œผ๋ฉด ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด์„œ ๊ณ„์† ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.
  • DFS์˜ ์žฅ์ ์€ ๋ฌดํ•œํžˆ ๊นŠ์€ ๊ณณ์„ ์ฐพ์•„์•ผ ํ•  ๋•Œ ํšจ๊ณผ์ ์ธ๋ฐ, ๋ชจ๋“  ๊ณณ์„ ๋ฐฉ๋ฌธํ•˜๊ธฐ์— ํ•„์š” ์—†๋Š” ๊ฒฝ๋กœ๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ ๋น„ํšจ์œจ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ํ•„์š” ์—†๋Š” ๊ฒฝ๋กœ๋Š” ์ฐจ๋‹จํ•˜๊ณ  ๋ชฉํ‘œ์ง€์ ์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฃจํŠธ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น์ด๋‹ค.

About

C++ study, algorithm, problem solving

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages