๊ธฐ๋ณธ ์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๊ธ€

7์›”, 2017์˜ ๊ฒŒ์‹œ๋ฌผ ํ‘œ์‹œ

[BOJ 4883] ์‚ผ๊ฐ ๊ทธ๋ž˜ํ”„ - DP, vector ์ด์ฐจ์›๋ฐฐ์—ด ์ดˆ๊ธฐํ™”

1๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ column์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋Œ๋ฉด์„œ dp๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

[BOJ 2876]์ˆจ์€ ์กฐ๊ฑด์„ ํŒŒ์•…ํ•˜๊ธฐ

์ฑ„์ ํ•œ ํ•™์ƒ์˜ ์ ์ˆ˜๊ฐ€ ๋ชจ๋‘ ๊ฐ™๋‹ค๋Š” ๋ง์—๋Š”, ์ฑ…์ƒ์ด ์—ฐ์†์ ์œผ๋กœ ์œ„์น˜ํ•ด์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ์กฐ๊ฑด์ด ์ˆจ์–ด์žˆ๋‹ค.

[BOJ 2293]๋™์ „1 - DP์—์„œ ์ค‘๋ณต์„ ์ œ์™ธํ•˜๋Š” ๋ฒ•

#include <cstdio> #include <iostream> #include <vector> using namespace std; int main(void) {     int N,K;     int result[10001] ={0,};     scanf("%d %d",&N,&K);     vector<int> vec;     for (int i=0; i<N; i++){         int input;         scanf("%d",&input);         vec.push_back(input);     }          //์ค‘๋ณต์„ ์ œ์™ธํ•˜๋Š” ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐํ•ด์•ผ๋  ๋ถ€๋ถ„์„ ๋ฐ”๊นฅ loop์— ๊ฐ์‹ผ๋‹ค.     for (int i=0;i<vec.size();i++)     {         for (int j=1;j<=K;j++){             if ((j-vec[i]) < 0)                 continue;             if ((j-vec[i]) == 0)                 result[j]+=1;             else          ...

Median๊ฐ’ ์ฐพ๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ถœ์ฒ˜ : https://o-tantk.github.io/posts/finding-median/ (๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!) ์ค‘์•™๊ฐ’ ์ฐพ๊ธฐ ์ค‘์•™๊ฐ’์€ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.์ •๋ ฌ ํ›„์—”, ๋‹จ์ˆœํžˆ ๋ฐฐ์—ด ํฌ๊ธฐ์˜ ์ ˆ๋ฐ˜์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์— ์ ‘๊ทผํ•ด ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค. ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ค‘์•™๊ฐ’(Running Median) ์ฐพ๊ธฐ ์ˆ˜ํ–‰ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅธ, ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ์ •๋ ฌ๊ณผ ํ•จ๊ป˜ ์ด๋ฃจ์–ด์ง€๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ด์šฉ, Heap ์•Œ๊ณ ๋ฆฌ์ฆ˜ Max heap์€ ์ตœ๋Œ€๊ฐ’์— ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. Min heap์€ ์ตœ์†Œ๊ฐ’์— ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. Heap์˜ ๋‘ ์„ฑ์งˆ ์ด์šฉํ•ด, ์ค‘์•™๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์€ Max heap์—, ์ค‘์•™๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’๋“ค์€ Min heap์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ค‘์•™๊ฐ’์„ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์ƒํ™ฉ์„ ๋ณด์ž. ๋จผ์ €, ์ž‘์€ ๊ฐ’๊ณผ ํฐ ๊ฐ’์„ ๋‚˜๋ˆŒ ๊ธฐ์ค€์ด ํ•„์š”ํ•˜๋‹ค. ์ค‘์•™๊ฐ’์ด ์•„๋‹ˆ๋ผ ๊ตณ์ด ๊ธฐ์ค€์ด๋ผ ํ‘œํ˜„ํ•œ ์ด์œ ๋Š”, ๊ฐœ์ˆ˜๊ฐ€ ์ง์ˆ˜์ผ ๋•Œ๋ฅผ ๊ณ ๋ คํ•ด์„œ์ด๋‹ค. ๊ธฐ์ค€์€ ์–ด์ฐจํ”ผ ๊ฐ€์šด๋ฐ์— ์žˆ์œผ๋‹ˆ, ๋ณ€์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค ํ•„์š” ์—†์ด Max heap ๋˜๋Š” Min heap์— ํฌํ•จ์‹œํ‚ค๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„  Max heap์„ ์ด์šฉํ–ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ž…๋ ฅ์€ ๋ณ„ ์ˆ˜ ์—†์ด ๊ธฐ์ค€์ด ๋œ๋‹ค. ํ™€์ˆ˜๊ฐœ์ด๋ฏ€๋กœ ์ค‘์•™๊ฐ’์€  3 ์ด๋‹ค. ๋‚˜๋จธ์ง€๋Š” ๊ธฐ์ค€๋ณด๋‹ค ์ž‘๋‹ค๋ฉด Max heap์—, ํฌ๋‹ค๋ฉด Min heap์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ , Max heap๊ณผ Min heap์˜ ํฌ๊ธฐ๊ฐ€ ๊ท ํ˜•๋˜๋„๋ก ์กฐ์ ˆํ•œ๋‹ค. ๋‹ค๋งŒ, ๊ธฐ์ค€์„ ๊ณ ๋ คํ•ด ๊ธฐ์ค€์„ ๊ฐ€์ง„์ชฝ์ด ํ•˜๋‚˜๋Š” ๋” ํด ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค. 2 ๋Š” ๊ธฐ์ค€๋ณด๋‹ค ์ž‘์œผ๋‹ˆ Max heap์— ๋„ฃ์ง€๋งŒ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด Max heap์˜ ์ตœ๋Œ€๊ฐ’์„ ์ด๋™์‹œํ‚จ๋‹ค. ์ง์ˆ˜๊ฐœ์ด๋ฏ€๋กœ ์ค‘์•™๊ฐ’์€  2 ์™€  3 ์˜ ํ‰๊ท ์ด๋‹ค. 4 ๋Š” ๊ธฐ์ค€๋ณด๋‹ค ํฌ๋‹ˆ Min heap์— ๋„ฃ์ง€๋งŒ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด Min heap์˜ ์ตœ์†Œ๊ฐ’์„ ์ด๋™์‹œํ‚จ๋‹ค. ํ™€์ˆ˜๊ฐœ์ด๋ฏ€๋กœ ์ค‘์•™๊ฐ’์€  3 ์ด๋‹ค. 1 ์€ ๊ธฐ์ค€๋ณด๋‹ค ์ž‘์œผ๋‹ˆ Max heap์— ๋„ฃ์ง€๋งŒ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด Max heap์˜ ์ตœ๋Œ€๊ฐ’์„ ์ด๋™์‹œํ‚จ๋‹ค. ์ง์ˆ˜๊ฐœ์ด๋ฏ€๋กœ ์ค‘์•™๊ฐ’์€  2 ์™€...

Floyd-Warshall Algorithm๊ณผ running time

์ •์˜ ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋“  ๊ผญ์ง“์  ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Œ์ˆ˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” ๊ฐ„์„ ๋„ ์ˆœํ™˜๋งŒ ์—†๋‹ค๋ฉด ์ž˜ ์ฒ˜๋ฆฌ ๋œ๋‹ค.  ์ œ์ผ ๋ฐ”๊นฅ์ชฝ ๋ฐ˜๋ณต๋ฌธ์€ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ผญ์ง“์ ์ด๊ณ , ๋‘ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์€ ์ถœ๋ฐœํ•˜๋Š” ๊ผญ์ง“์ , ์„ธ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์€ ๋„์ฐฉํ•˜๋Š” ๊ผญ์ง“์ ์ด๋‹ค. running time ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ชจ๋“  ์ •์  ๊ฐ„ ๊ฒฝ๋กœ์˜ ์ตœ์†Œ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์€ O(V^3) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.  ๊ฒฝ์œ ์ง€๋ฅผ ๊ธฐ๋กํ•œ ๊ฒฝ์šฐ, ๊ฒฝ๋กœ๋ฅผ ์—ญ์œผ๋กœ ์ถ”์ถœํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ณต์žก๋„๋Š” O(V) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.  ์ข…์ข… ๋ฐ์ดํฌ์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ž์ฃผ ๋น„๊ต๋˜๊ณค ํ•˜๋Š”๋ฐ, ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ชจ๋‘ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ๋งž๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ์ • ํ•„์š”์„ฑ์ด ์š”๊ตฌ๋œ๋‹ค. ์†Œ์Šค์ฝ”๋“œ : https://github.com/JaeguKim/Algorithm/tree/master/Floyd ์ถ”๊ฐ€ ์ฐธ๊ณ  : http://hsp1116.tistory.com/45

Linear search, binary search

์„ ํ˜• ๊ฒ€์ƒ‰(Linear Search) ๋‹ค๋ฅธ์ด๋ฆ„์œผ๋กœ ์ˆœ์ฐจ ๊ฒ€์ƒ‰(Sequential Search) ์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ์„ ํ˜•๊ฒ€์ƒ‰์— ๋Œ€ํ•˜์—ฌ ๋จผ์ € ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ ํ˜• ๊ฒ€์ƒ‰์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ์ธ ์ง‘ํ•ฉ(๋ฐฐ์—ด, ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ๋“ฑ)์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ์ˆœ์„œ๋Œ€๋กœ ๋น„๊ตํ•˜๋ฉฐ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์•„๋‚ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ถ„  ํƒ์ƒ‰(Binary Search) ์„ ํ˜•๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์˜ ์ฒ˜์Œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์ง€๋งŒ ์ด์ง„๊ฒ€์ƒ‰์€ ์ค‘๊ฐ„๊ฐ’๋ถ€ํ„ฐ ํƒ์ƒ‰ ์„ ํ˜•๊ฒ€์ƒ‰์€ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” ๋ฐ˜๋ฉด์— ์ด์ง„๊ฒ€์ƒ‰์€ ํŠธ๋ฆฌ๊ตฌ์กฐ์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋ฉด์„œ ์—ฐ์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์   ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์ด ๋ฐ˜๋“œ์‹œ ์ •๋ ฌ(Sort)๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ์ฒ˜: http://andrew0409.tistory.com/143 [C ์ฝ์–ด์ฃผ๋Š” ์˜ค๋น ] ์ถœ์ฒ˜: http://andrew0409.tistory.com/143

Dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์‹คํ–‰์‹œ๊ฐ„(Priority Queue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ )

์ •์˜ ์–ด๋–ค ๋ณ€๋„ ์Œ์ˆ˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” ์œ ํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์ฃผ์–ด์ง„ ์ถœ๋ฐœ์ ๊ณผ ๋„์ฐฉ์  ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์•Œ๊ณ ๋ฆฌ์ฆˆ ๊ฐœ์š” ๋ฐ์ดํฌ์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ๊ฐ์˜ ๊ผญ์ง“์  v์— ๋Œ€ํ•ด s์—์„œ v๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ d[v]๋ฅผ ์ €์žฅํ•˜๋ฉด์„œ ์ž‘๋™ํ•œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ์ž‘ ์‹œ์— d[s]=0์ด๊ณ , s๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ผญ์ง“์  v์— ๋Œ€ํ•ด์„œ๋Š” d[v]=∞๋กœ ๋†“์•„ ๋‹ค๋ฅธ ๊ผญ์ง“์ ์— ๋Œ€ํ•ด์„œ๋Š” ์•„์ง ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋ฅธ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ‘œ์‹œํ•œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ d[v]๋Š” s์—์„œ v๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋˜๊ณ , ๋งŒ์•ฝ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฑฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๋ฌดํ•œ๋Œ€๋กœ ๋‚จ๋Š”๋‹ค. ๋ฐ์ดํฌ์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ณ€ ๊ฒฝ๊ฐ(edge relaxation)์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ธฐ๋ณธ ์—ฐ์‚ฐ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ๋‹ค. s์—์„œ u๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ(d[u])๋ฅผ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ณ , u์—์„œ v๊นŒ์ง€ ๊ธธ์ด๊ฐ€ w(u,v)์ธ ๋ณ€ (u, v)๊ฐ€ ์กด์žฌํ•  ๋•Œ, s์—์„œ v๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” u๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ์— ๋ณ€ (u, v)๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ๋กœ์˜ ๋น„์šฉ์€ d[u]+w(u, v)๊ฐ€ ๋˜๋ฉฐ, ์ด ๋น„์šฉ์ด ํ˜„์žฌ์˜ d[v] ๊ฐ’๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด d[v]๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ฐ”๊พผ๋‹ค. ๊ฒฝ๊ฐ ์—ฐ์‚ฐ์€ ๋ชจ๋“  ๋ณ€ (u, v)์— ๋Œ€ํ•ด ํ•œ๋ฒˆ์”ฉ ๊ฒฝ๊ฐ์ด ์ ์šฉ๋˜์–ด ๋ชจ๋“  d[v]๊ฐ€ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๋น„์šฉ์„ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ๋๋‚œ๋‹ค. ์‹คํ–‰์‹œ๊ฐ„ ๊ฐœ์˜ ๋ณ€๊ณผ  {\displaystyle n} ๊ฐœ์˜  ๊ผญ์ง“์  ์„ ๊ฐ€์ง„  ๊ทธ๋ž˜ํ”„ ์— ๋Œ€ํ•ด  ๋Œ€๋ฌธ์ž O ํ‘œ๊ธฐ๋ฒ• ์œผ๋กœ ๋ฐ์ดํฌ์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹คํ–‰์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์œผ๋กœ,  Q ์˜ ์ง‘ํ•ฉ์„  ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋‚˜  ๋ฐฐ์—ด  ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  Extract-Min(Q) ํ•จ์ˆ˜๋ฅผ ๋‹จ์ˆœํ•œ  ์„ ํ˜• ํƒ์ƒ‰ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ์‹คํ–‰ ์‹œ๊ฐ„์€  {\displaystyle O(n^{2})}  ์‹œ๊ฐ„์ด ๋œ๋‹ค. ๋งŒ์•ฝ ํฌ์†Œ ๊ทธ๋ž˜ํ”„(sparse graph), ์ฆ‰  {\displaystyle n^{2}} ๋ณด๋‹ค ํ›จ์”ฌ ์ž‘์€ ๊ฐœ์ˆ˜์˜ ๋ณ€๋งŒ์„ ๊ฐ–๋Š” ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•ด์„œ๋Š”,...

Quicksort ๊ฐœ์„ ํ•˜๊ธฐ

■ ๋ฐฉ๋ฒ•1 : ๋น„์žฌ๊ท€๋กœ ๊ตฌํ˜„ quick_sort()ํ•จ์ˆ˜๋กœ 20,000๊ฐœ ์ •๋„์˜ ์ •์ˆ˜๋ฅผ ์ •๋ ฌํ•˜๋‹ค๋ณด๋ฉด ๊ฐ‘์ž๊ธฐ ์ด์ƒํ•œ ๋ฌธ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ์‹คํ–‰์ด ์ค‘์ง€๋˜๋Š” ํ˜„์ƒ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋‚ด๋ถ€ ์Šคํƒ์˜ ์˜ค๋ฒ„ํ”Œ๋กœ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ•์ œ๋กœ ์ค‘์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•œ ๋ฒˆ์˜ ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ ๋ณต๊ท€ ์ฃผ์†Œ 2๋ฐ”์ดํŠธ, n 2๋ฐ”์ดํŠธ, a 2๋ฐ”์ดํŠธํ•ด์„œ ๋ชจ๋‘ 6๋ฐ”์ดํŠธ์˜ ์Šคํƒ์ด ์‚ฌ์šฉ๋œ๋‹ค. 20,000๊ฐœ ์ •๋„์˜ ์ •์ˆ˜๋ฅผ ํ€ต ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ •ํ™•ํžˆ ๋ถ„ํ• ์ด ์ด๋“ฑ๋ถ„๋œ๋‹ค๋ฉด ์žฌ๊ท€์˜ ๊นŠ์ด๊ฐ€ 15(log220000)์ด๋ฉด ๋˜๋ฏ€๋กœ 15*6=90๋ฐ”์ดํŠธ ๋ฐ–์— ์Šคํƒ์ด ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์ตœ์•…์˜ ๊ฒฝ์šฐ(์—ญ์ˆœ ๋ฐฐ์—ด์ด๋‚˜ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ)N๋งŒํผ ์žฌ๊ท€๊ฐ€ ๊นŠ์–ด์ง€๋ฏ€๋กœ 20000*6=120000๋ฐ”์ดํŠธ ์•ฝ 120KB ๊ฐ€๋Ÿ‰์ด ์†Œ๋ชจ๋˜์–ด ์Šคํƒ์€ ๋„˜์น˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์€ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์—†์• ๊ณ  ์ง์ ‘ ์Šคํƒ์„ ๋งŒ๋“ค์–ด ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์ง์ ‘ ์Šคํƒ์„ ๋งŒ๋“ค์–ด์“ฐ๊ฒŒ๋˜๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์˜ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ ํ˜„์ƒ์œผ๋กœ ์†๋„๊ฐ€ ์‹œ์› ์Šค๋Ÿฝ๊ฒŒ ์˜ค๋ฅด์ง€ ์•Š๋Š”๋‹ค. ์ •๋ ฌ๋œ ๋ฐฐ์—ด๊ณผ ์—ญ์ˆœ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ๋น„ํ•ด ๋ฌด๋ ค 40๋ฐฐ ๊ฐ€๋Ÿ‰์ด๋‚˜ ๋А๋ฆฌ๋‹ค. ■ ๋ฐฉ๋ฒ•2 : ๋‚œ์ˆ˜ ๋ถ„ํ•  ์ •๋ ฌ๋œ ๋ฐฐ์—ด๊ณผ ์—ญ์ˆœ ๋ฐฐ์—ด์ผ ๋•Œ ํ€ต ์ •๋ ฌ์˜ ์†๋„๊ฐ€ ํ˜„์ €ํžˆ ๋А๋ ค์ง€๋Š” ๊ฒƒ์€ ์ถ•๊ฐ’์œผ๋กœ์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์˜ ๊ฐ’์„ ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด๋‚˜ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด ์ถ•๊ฐ’์ด ๋˜๊ธฐ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ถ•๊ฐ’์„ ์ž˜ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ž…๋ ฅ๋˜๋Š” ์ž๋ฃŒ๊ฐ€ ์ž„์˜์ ์ธ ๊ฒƒ์ด๋ฏ€๋กœ ์ผ๊ด€์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ถ•๊ฐ’์„ ์ž˜ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‹ค ํ•œ ๊ฐ€์ง€ ๋Œ€์•ˆ์œผ๋กœ ์ œ์‹œ๋˜๋Š” ๊ฒƒ์€ ์ถ•๊ฐ’์„ ๋‚œ์ˆ˜(random)์œผ๋กœ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ■ ๋ฐฉ๋ฒ•3 : ์‚ฝ์ž…์ •๋ ฌ ํ‡ ์ •๋ ฌ์ด ๋” ์ด์ƒ ๋นจ๋ผ์งˆ์ˆ˜ ์žˆ๋Š”๊ฐ€? ํ€ต์ •๋ ฌ์€ ๊ตฌ๊ฐ„์„ ์ชผ๊ฐœ๋ฉด์„œ ์ •๋ ฌ์„ ํ•ด ๋‚˜๊ฐ„๋‹ค. ํฐ ๊ตฌ๊ฐ„์„ ์ชผ๊ฐœ๋‚˜๊ฐ€๋Š” ๊ฒƒ์€ ํ€ต ์ •๋ ฌ๋กœ ํ•˜๊ณ  ์ž‘์€ ๊ตฌ๊ฐ„์— ๋Œ€ํ•ด์„œ๋Š” ๋” ์„ฑ๋Šฅ์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์‚ฝ์ž… ์ •๋ ฌ์€ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ์ž‘์€ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์—์„œ๋Š” ๋งค์šฐ ํšจ์œจ์ด ์ข‹๋‹ค. ๋˜ํ•œ ์‚ฝ์ž… ์ •๋ ฌ์€ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•„์š”์น˜ ์•Š๋Š”๋‹ค. ์ž‘์€ ๊ตฌ๊ฐ„์— ๋Œ€ํ•œ ์‚ฝ์ž… ์ •๋ ฌ์„ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ์€ ํ€ต ์ •๋ ฌ์˜ ์žฌ๊ท€์˜ ...

Minimum spanning tree๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

์œ„ ๊ทธ๋ฆผ  ์ถœ์ฒ˜ :http://findfun.tistory.com/385 ์ •์˜ ์ตœ์†Œ๋น„์šฉ ์‹ ์žฅํŠธ๋ฆฌ๋ž€ spanning tree์˜ ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€๋ฆฌ์ผœ '์ตœ์†Œ ๋น„์šฉ ์‹ ์žฅ ํŠธ๋ฆฌ'๋ผ๊ณ  ํ•œ๋‹ค. ์ตœ์†Œ๋น„์šฉ ์‹ ์žฅํŠธ๋ฆฌ์—๋Š” ์‚ฌ์ดํด์ด ์ƒ๊ฒจ์„œ๋Š” ์•ˆ๋œ๋‹ค.(ํŠธ๋ฆฌ์˜ ๊ธฐ๋ณธ์กฐ๊ฑด) ๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1) ํฌ๋ฃจ์Šค์นผ  ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ„์„ ์„ ์ •๋ ฌํ•œ ํ›„์— MST๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ์„ ํƒ ๋˜๋Š” ์‚ญ์ œํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹ ์‹œ๊ฐ„๋ณต์žก๋„ ํฌ๋Ÿฌ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(Elog V) ์‹œ๊ฐ„ ์•ˆ์— ๋™์ž‘ํ•œ๋‹ค๊ณ  ์ฆ๋ช… 2)ํ”„๋ฆผ ํ•˜๋‚˜์˜ ์ •์ ์„ ์‹œ์ž‘์œผ๋กœ MST๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ํŠธ๋ฆฌ๋ฅผ ํ™•์žฅํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹ ์‹œ๊ฐ„๋ณต์žก๋„ ์ฐธ๊ณ : https://ko.wikipedia.org/wiki/%ED%94%84%EB%A6%BC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

Sorting algorithm ์„ฑ๋Šฅ๋น„๊ต

๊ทธ๋ฆผ์ถœ์ฒ˜ : http://dev-ahn.tistory.com/39 ์‚ฝ์ž…์ •๋ ฌ์˜ ๊ฒฝ์šฐ, ์ •๋ ฌ๋Œ€์ƒ์ด ์™„์ „ํžˆ ์ •๋ ฌ๋œ ์ƒํƒœ๋ผ๋ฉด ์•ˆ์ชฝ for๋ฌธ์—์„œ ๊ฑธ๋ฆฌ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด ๋œ๋‹ค. ๋ณ‘๋ ฌ์ •๋ ฌ์˜ ๊ฒฝ์šฐ, ์ž„์‹œ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•  ๋•Œ๋Š”์ด๋Ÿฐํ•œ ๋‹จ์ ์„ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ํž™์ •๋ ฌ์˜ ๊ฒฝ์šฐ๋„ ํž™์ €์žฅ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ํ€ต์†ŒํŠธ์˜ ๊ฒฝ์šฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ ๋ฐ์ดํ„ฐ๋“ค์ด ์ •๋ ฌ๋œ ์ƒํƒœ์ด๊ณ  pivot์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์œผ๋กœ ๊ฒฐ์ •๋˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‘˜๋กœ ๋‚˜๋‰˜๋Š” ํšŸ์ˆ˜ k = n์ด๊ณ  ๋˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ O(n^2)์ด ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ, pivot๊ฐ’์„ ๊ฐ€์šด๋ฐ์— ๋‘๋ฉด ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋œ๋‹ค. Radix(๊ธฐ์ˆ˜)์ •๋ ฌ์˜ ๊ฒฝ์šฐ, ์„ฑ๋Šฅ์€ ๊ฐ€์žฅ์ข‹์ง€๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ์ œํ•œ์ ์ด๋‹ค.

Priority queue, Heap์ด๋ž€

Priority Queue : ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๋‚˜์˜ค๋Š” queue Heap์ด๋ž€ : ์œ„ํ‚ค๋ฐฑ๊ณผ์— ๋”ฐ๋ฅด๋ฉด 'ํŠน๋ณ„ํ•œ ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.'๋ผ๊ณ  ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํŠน๋ณ„ํ•œ ํŠธ๋ฆฌ๋ž€ ์šฐ๋ฆฌ๊ฐ€ ์ „์— ๋ฐฐ์šด ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋งํ•˜๋ฉฐ, ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ตœ๋Œ€ ํž™(Max Heep) ๊ณผ ์ตœ์†Œ ํž™(Min Heep) ์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ ์ด๋Ÿฌํ•œ ํž™์€ ์ตœ๋Œ€๊ฐ’ ๋˜๋Š” ์ตœ์†Œ๊ฐ’์„ ์งง์€ ์‹œ๊ฐ„๋‚ด์— ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€ ํž™์ด๋ž€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’์ด ํ•ญ์ƒ ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ, ์ตœ์†Œ ํž™์€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’์ด ํ•ญ์ƒ ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.  ์ถœ์ฒ˜: http://blog.eairship.kr/249 [๋ˆ„๊ตฌ๋‚˜๊ฐ€ ๋‹ค ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฒซ๊ฑธ์Œ] ์†Œ์Šค์ฝ”๋“œ: https://github.com/JaeguKim/Algorithm/tree/master/Heap

Dynamic Programming์˜ ์ •์˜์™€ Greedy Algorithm ๊ณผ์˜ ๋น„๊ต

Dynamic Programming ์ผ๋ฐ˜์ ์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ, ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ๋ฌธ์ œ(subproblem)์œผ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ผ ๋‹ค์Œ,  ๊ทธ๊ฒƒ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ตœ์ข…์ ์ธ ๋ชฉ์ ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ ํ•˜์œ„ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์„ ๊ณ„์‚ฐํ•œ๋’ค, ๊ทธ ํ•ด๊ฒฐ์ฑ…์„ ์ €์žฅํ•˜์—ฌ ํ›„์— ๊ฐ™์€ ํ•˜์œ„ ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”์„ ๊ฒฝ์šฐ ๊ทธ๊ฒƒ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์  ๊ณ„ํš๋ฒ•์€ ๊ณ„์‚ฐ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. Greedy Algorithm๊ณผ์˜ ๋น„๊ต ๋™์  ๊ณ„ํš๋ฒ•์€ ์ฃผ๋จน๊ตฌ๊ตฌ์‹์ด๋ผ๋Š” ๋‹จ์ ์ด์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋“ฑ์žฅํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•ญ์ƒ ์ตœ์ ํ•ด๋ฅผ ๊ตฌํ•ด์ฃผ์ง€๋Š” ์•Š์ง€๋งŒ, ๋‹คํ–‰ํžˆ MST(์ตœ์†Œ ๋น„์šฉ ๋‚˜๋ฌด ๋ฌธ์ œ)๋“ฑ์˜ ์—ฌ๋Ÿฌ ๋ฌธ์ œ์—์„œ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ตœ์ ํ•ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ์ด ์ž…์ฆ๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋™์  ๊ณ„ํš๋ฒ•์„ ๋น„๊ตํ•˜์ž. ์šฐ๋ฆฌ๊ฐ€ ์ฐจ๋Ÿ‰ ์ •์ฒด ๊ตฌ๊ฐ„์—์„œ A๋ผ๋Š” ์ง€์ ์—์„œ B๋ผ๋Š” ์ง€์ ๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž. ์ด ๋ฌธ์ œ์—์„œ ๋™์  ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ƒํ™ฉ๊ณผ ๊ตํ†ต ์ •์ฒด๋ฅผ ์ „๋ถ€ ๊ฐ์•ˆํ•˜์—ฌ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค. ๋ฐ˜๋ฉด ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ „์ฒด์ ์ธ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ , ์ˆœ๊ฐ„์ˆœ๊ฐ„ ๊ต์ฐจ๋กœ๊ฐ€ ๋ณด์ผ ๋•Œ๋งˆ๋‹ค ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒฝ๋กœ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฐพ์•„์ค„ ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋™์•ˆ ์šฐ๋ฆฌ๊ฐ€ ์šด์ „์„ ์ž ๊น ์‰ฌ์–ด์•ผ ํ•˜๋“ฏ์ด, ์šฐ๋ฆฌ๋Š” ๋™์  ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒ ์–ป์–ด๋‚ธ ๊ฒฝ๋กœ๋Š” (๊ตํ†ต ํ™˜๊ฒฝ์ด ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฐ€์ • ํ•˜์—) ์šฐ๋ฆฌ๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๊ธธ์ด ๋œ๋‹ค๊ณ  ์žฅ๋‹ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฆ‰ํšจ์„ฑ์ด ์žˆ๋Š” ๋Œ€์‹ , ํ•ญ์ƒ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ฐ ๊ตฌ๊ฐ„๋งˆ๋‹ค ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๋‹ค๊ณ  ํ•ด๋„ ๊ทธ๊ฒƒ์ด ์ „์ฒด์ ์œผ๋กœ ์ตœ์ ์˜ ๊ฒฝ๋กœ๊ฐ€ ๋˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ๋™์  ๊ณ„ํš๋ฒ•์€ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ์‹œ๊ฐ„์ ์œผ๋กœ๋Š” ํšจ์œจ์ ์ด์ง€ ๋ชปํ•  ์ˆ˜๋Š” ์žˆ์–ด๋„, ๊ทธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด์„œ๋Š” ํšจ์œจ์ ์ธ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

P, NP, NP Complete, NP Hard ์ •์˜

P์˜ ์ •์˜ P(PTIME ๋˜๋Š” DTIME(nO(1)))๋Š” ๊ฒฐ์ •๋ก ์  ํŠœ๋ง ๊ธฐ๊ณ„๋กœ ๋‹คํ•ญ ์‹œ๊ฐ„ ์•ˆ์— ํ’€ ์ˆ˜ ์žˆ๋Š” ํŒ์ • ๋ฌธ์ œ๋ฅผ ๋ชจ์•„ ๋†“์€ ๋ณต์žก๋„ ์ข…๋ฅ˜์ด๋‹ค. NP์˜ ์ •์˜ NP๋Š” ๋น„๊ฒฐ์ •๋ก ์  ํŠœ๋ง ๊ธฐ๊ณ„(NTM)๋กœ ๋‹คํ•ญ ์‹œ๊ฐ„ ์•ˆ์— ํ’€ ์ˆ˜ ์žˆ๋Š” ํŒ์ • ๋ฌธ์ œ์˜ ์ง‘ํ•ฉ์œผ๋กœ, NP๋Š” ๋น„๊ฒฐ์ •๋ก ์  ๋‹คํ•ญ์‹œ๊ฐ„(้žๆฑบๅฎš่ซ–็š„ ๅคš้ …ๆ™‚้–“, Non-deterministic Polynomial time)์˜ ์•ฝ์ž NP Complete์˜ ์ •์˜๋Š”? NP-์™„์ „(NP-complete, NP-C, NPC)์€ NP ์ง‘ํ•ฉ์— ์†ํ•˜๋Š” ๊ฒฐ์ • ๋ฌธ์ œ ์ค‘์—์„œ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ฌธ์ œ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ, ๋ชจ๋“  NP ๋ฌธ์ œ๋ฅผ ๋‹คํ•ญ ์‹œ๊ฐ„ ๋‚ด์— NP-์™„์ „ ๋ฌธ์ œ๋กœ ํ™˜์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.  NP-์™„์ „ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ P์— ์†ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•œ๋‹ค๋ฉด ๋ชจ๋“  NP ๋ฌธ์ œ๊ฐ€ P์— ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, P-NP ๋ฌธ์ œ๊ฐ€ P=NP์˜ ํ˜•ํƒœ๋กœ ํ’€๋ฆฌ๊ฒŒ ๋œ๋‹ค.  ๋ฐ˜๋Œ€๋กœ NP-์™„์ „ ๋ฌธ์ œ ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ P์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์ฆ๋ช…๋œ๋‹ค๋ฉด P=NP์— ๋Œ€ํ•œ ๋ฐ˜๋ก€๊ฐ€ ๋˜์–ด P-NP ๋ฌธ์ œ๋Š” P≠NP์˜ ํ˜•ํƒœ๋กœ ํ’€๋ฆฌ๊ฒŒ ๋œ๋‹ค. NP Hard์˜ ์ •์˜ NP-๋‚œํ•ด๋Š” ์ ์–ด๋„ ๋ชจ๋“  NP ๋ฌธ์ œ๋งŒํผ์€ ์–ด๋ ค์šด ๋ฌธ์ œ๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค. NP-๋‚œํ•ด ์ง‘ํ•ฉ์— ์†ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ NP์—๋„ ์†ํ•˜๋ฉด NP-์™„์ „์— ์†ํ•œ๋‹ค. ์ฆ‰, NP-์™„์ „์€ NP์™€ NP-๋‚œํ•ด์˜ ๊ต์ง‘ํ•ฉ์ด๋‹ค.

Topological Sorting ์ •์˜์™€ ์†Œ์Šค์ฝ”๋“œ

์œ„์ƒ ์ •๋ ฌ(topological sorting) ์œ ํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๊ผญ์ง“์ ๋“ค(vertex)์„ ๋ณ€์˜ ๋ฐฉํ–ฅ์„ ๊ฑฐ์Šค๋ฅด์ง€ ์•Š๋„๋ก ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ •๋ ฌ์˜ ์ˆœ์„œ๋Š” ์œ ํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ข…๋ฅ˜๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์œ„์ƒ ์ •๋ ฌ์ด ์„ฑ๋ฆฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ๋ž˜ํ”„์˜ ์ˆœํ™˜์ด ์กด์žฌํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ์ด ์ ์—์„œ ๋น„์ˆœํ™˜ ์œ ํ–ฅ ๊ทธ๋ž˜ํ”„(directed acyclic graph) ์ด๋‹ค. ์†Œ์Šค์ฝ”๋“œ : https://github.com/JaeguKim/Algorithm

๊ทธ๋ž˜ํ”„,ํŠธ๋ฆฌ์˜ ์ •์˜

๊ทธ๋ž˜ํ”„(์˜์–ด: graph) ์ผ๋ จ์˜ ๊ผญ์ง“์ (V)๋“ค๊ณผ ๊ทธ ์‚ฌ์ด๋ฅผ ์ž‡๋Š” ๋ณ€(E)๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๊ตฌ์กฐ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ : cycle์ด ์—†๋Š” graph ํŠธ๋ฆฌ ๊ตฌ์กฐ(tree ๆง‹้€ , ๋ฌธํ™”์–ด: ๋‚˜๋ฌด๊ตฌ์กฐ)๋ž€ ๊ทธ๋ž˜ํ”„์˜ ์ผ์ข…์œผ๋กœ, ์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ํ•œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ํšŒ๋กœ๊ฐ€ ์—†๊ณ  , ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋…ธ๋“œ๋ฅผ ์ž‡๋Š” ๊ธธ์ด ํ•˜๋‚˜๋ฟ์ธ ๊ทธ๋ž˜ํ”„๋ฅผ ํŠธ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํŠธ๋ฆฌ์—์„œ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ ๋…ธ๋“œ(root node ๋ฟŒ๋ฆฌ ๋…ธ๋“œ[*])๋ผ๊ณ  ํ•œ๋‹ค. ๋˜ํ•œ ๋…ธ๋“œ A๊ฐ€ ๋…ธ๋“œ B๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ A๋ฅผ B์˜ ๋ถ€๋ชจ ๋…ธ๋“œ(parent node), B๋ฅผ A์˜ ์ž์‹ ๋…ธ๋“œ(child node)๋ผ๊ณ  ํ•œ๋‹ค. ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ๋ฅผ ์žŽ ๋…ธ๋“œ(leaf node ๋ฆฌํ”„ ๋…ธ๋“œ[*])๋ผ๊ณ  ํ•œ๋‹ค. ์žŽ ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๋ฅผ ๋‚ด๋ถ€ ๋…ธ๋“œ(internal node)๋ผ๊ณ  ํ•œ๋‹ค ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ข…๋ฅ˜ ์ •์ด์ง„ ํŠธ๋ฆฌ(Full Binary Tree) ์ „์ฒด ๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ 2^(k-1)๊ฐœ์˜ ๋…ธ๋“œ์ด๊ณ , ๋ ˆ๋ฒจ i๋งˆ๋‹ค 2^(i-1)๊ฐœ์˜ ๋…ธ๋“œ๋“ค๋กœ ๊ฝ‰ ์ฐฌ ํŠธ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. ์ „์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree) ์ „์ด์ง„ ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ n๊ฐœ์ผ ๋•Œ, ์ •์ด์ง„ ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ์— ๋ถ™์ธ 1~n์˜ ์ผ๋ จ๋ณ€ํ˜ธ์™€ 1:1๋กœ ๋Œ€์‘๋˜๋Š” ํŠธ๋ฆฌ, ์ค‘๊ฐ„์— ๋นˆ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์ „์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค.

[๋ฐฑ์ค€ 2751] c++๋กœ ํ€ต์†ŒํŠธ๋กœ ํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„์ดˆ๊ณผ ๋‚˜๋Š”๊ฒฝ์šฐ ๋ฐœ์ƒํ•ด๊ฒฐ( feat printf, scanf ์‚ฌ์šฉํ•˜์ž!)

cin ๋Œ€์‹ ์— scanf๋ฅผ cout ๋Œ€์‹ ์— printf๋ฅผ ์‚ฌ์šฉํ•˜์ž!

[๋ฐฑ์ค€ 10989] ์ˆ˜์ •๋ ฌํ•˜๊ธฐ feat. Quick Sort VS Counting Sort ๋น„๊ต

 *QuickSort ๋ฒ„์ „* #include <iostream> #include <string> using namespace std ; void swap( int arr[], int a, int b) {     int temp = arr[a];     arr[a] = arr[b];     arr[b] = temp; } int partition( int arr[], int left, int right) {     int pivot = arr[left];     int low = left + 1 ;     int high = right;          while (low <= high)     {         while (low <= right && pivot >= arr[low])             low++;                  while (high >= left+ 1 && pivot <= arr[high])             high--;                  if (low <= high)         {             swap (arr, low, high);         }     }  ...

[๋ฐฑ์ค€ 1152๋ฒˆ] ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜

#include <iostream> #include <string> using namespace std ; int main( int argc, const char * argv[]) {     string str;     getline ( cin ,str);          int cnt = 0 ;          for ( int i = 0 ; i < str. length (); i++){         if (str. at (i) == ' ' )             cnt++;     }          if (str. at ( 0 ) == ' ' )         cnt--;     if (str. at (str. length () - 1 ) == ' ' )         cnt--;          cout << cnt+ 1 ; }

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์€ ์ตœ์ ํ•ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋˜๋Š” ๊ทผ์‚ฌ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ,  ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ ์ˆœ๊ฐ„์— ์ตœ์ ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒƒ์„ ์„ ํƒํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์—ฌ ์ตœ์ข…์ ์ธ ํ•ด๋‹ต์— ๋„๋‹ฌํ•œ๋‹ค.  ์ˆœ๊ฐ„๋งˆ๋‹ค ํ•˜๋Š” ์„ ํƒ์€ ๊ทธ ์ˆœ๊ฐ„์— ๋Œ€ํ•ด ์ง€์—ญ์ ์œผ๋กœ๋Š” ์ตœ์ ์ด์ง€๋งŒ, ๊ทธ ์„ ํƒ๋“ค์„ ๊ณ„์† ์ˆ˜์ง‘ํ•˜์—ฌ ์ตœ์ข…์ (์ „์—ญ์ )์ธ ํ•ด๋‹ต์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•ด์„œ, ๊ทธ๊ฒƒ์ด ์ตœ์ ์ด๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค. ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋Œ€๋ถ€๋ถ„ ํƒ์š•์Šค๋Ÿฐ ์„ ํƒ ์กฐ๊ฑด(greedy choice property)๊ณผ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ ์กฐ๊ฑด(optimal substructure)์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋งŒ์กฑ๋œ๋‹ค.  ํƒ์š•์Šค๋Ÿฐ ์„ ํƒ ์กฐ๊ฑด์€ ์•ž์˜ ์„ ํƒ์ด ์ดํ›„์˜ ์„ ํƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ, ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ ์กฐ๊ฑด์€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ ํ•ด๊ฐ€ ๋ถ€๋ถ„๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋„ ์—ญ์‹œ ์ตœ์ ํ•ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ์ ํ•ด๋ฅผ ๊ตฌํ•˜์ง€ ๋ชปํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋„ ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์€  ๊ทผ์‚ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ณ„์‚ฐ ์†๋„๊ฐ€ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์—ญ์‹œ ์–ด๋А ์ •๋„๊นŒ์ง€ ์ตœ์ ํ•ด์— ๊ฐ€๊นŒ์šด ํ•ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ณด์žฅํ•˜๋ ค๋ฉด ์—„๋ฐ€ํ•œ ์ฆ๋ช…์ด ํ•„์š”ํ•˜๋‹ค. ์–ด๋–ค ํŠน๋ณ„ํ•œ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์–ธ์ œ๋‚˜ ์ตœ์ ํ•ด๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ตฌ์กฐ๋ฅผ  ๋งคํŠธ๋กœ์ด๋“œ ๋ผ ํ•œ๋‹ค. ๋งคํŠธ๋กœ์ด๋“œ๋Š” ๋ชจ๋“  ๋ฌธ์ œ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‚˜, ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ฐœ๊ฒฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ™œ์šฉ๋„๋ฅผ ๋†’์—ฌ ์ค€๋‹ค. (์˜ˆ์‹œ) <๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜> ์Œ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š”  ๊ทธ๋ž˜ํ”„ ์—์„œ ํ•œ ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š”  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋‹ค.  ๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„,๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ๋ชจ๋‘ ์ƒ๊ด€์—†๋‹ค. *Minimum Spanning Tree (์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ) <ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜> Kruskal Algorithm๊ณผ Prim Algorithm์€ Greedy Algorithm๋ฅผ...

์†Œ์ˆ˜ํŒ๋ณ„

#include <iostream> #include <string> #include <ctype.h> using namespace std; int main(int argc, char * argv[]) { //input์ด ์—†์„๋•Œ ์—๋Ÿฌ๋ฐœ์ƒ if (argc < 2) { cout << "์—๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”." << endl; return 0; } int len = strlen(argv[1]); //์ˆซ์ž์ด์™ธ์˜ input์ด ๋“ค์–ด์™”์„๋•Œ ์—๋Ÿฌ๋ฐœ์ƒ for (int i = 0 ; i<len; i++) { if (isdigit(argv[1][i]) == 0) { cout << "์•ŒํŒŒ๋ฒณ์ด ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค." << endl; return 0; } } int input = stoi(argv[1]); //์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ์†Œ์ˆ˜ ํŒ๋ณ„ํ•˜๋Š” ๋ถ€๋ถ„     for (int i = 2; i < input; i++){         if (input % i == 0) { cout << "ํ•ฉ์„ฑ์ˆ˜ ์ž…๋‹ˆ๋‹ค." << endl; return 0; }            }      cout << "์†Œ์ˆ˜์ž…๋‹ˆ๋‹ค." << endl; return 0; }