C++: Trie ๊ตฌํ˜„ํ•˜๊ธฐ

Trie๋ฅผ ๊ฐœ๋…๋งŒ ์•Œ๊ณ , ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณธ ์ ์ด ์—†์—ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด๋ฅผ ํ•  ๋•Œ, ์š”๊ธดํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ฌธ์ œ์˜ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ •์ ์œผ๋กœ Trie๋ฅผ ํ• ๋‹นํ•ด๋‘๊ณ , ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋‹ค๋ฃจ๊ณ ์ž ํ•œ๋‹ค. Trie? ํŠธ๋ผ์ด (์ปดํ“จํŒ…) - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „ "A", "to", "tea", "ted", "ten", "i", "in", "inn"๋ฅผ ํ‚ค๋กœ ๋‘” ํŠธ๋ผ์ด. ์ด ์˜ˆ์ œ์—๋Š” ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€๋Š” ์•Š๋‹ค. (๋ฃจํŠธ ๋…ธ๋“œ์™€ 't' ๋…ธ๋“œ) ํŠธ๋ผ์ด(trie)๋Š” ์ปดํ“จํ„ฐ ko.wikipedia.org Trie๋ž€ root๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž์—ด์„ ์ €์žฅํ• ๋•Œ, ๊ฐ ๋…ธ๋“œ์— ์–ด๋–ค ..

C++: Priority Queue ๊ตฌํ˜„ํ•˜๊ธฐ

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ PQ(Priority Queue)๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋‹จ์ˆœํžˆ Parent, Left Child, Right Child์˜ ์ธ๋ฑ์Šค๋งŒ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , push, pop, updaet, erase ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฐ„๋žตํžˆ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. PQ์— ์‚ฝ์ž…ํ•  ๋ฐ์ดํ„ฐ struct Info { int idx; int score; } PQ์— ์‚ฝ์ž…ํ•  ๋ฐ์ดํ„ฐ๋Š” ์ผ๋ฐ˜ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ, ์‚ฌ์šฉ์ž ์ง€์ • ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๊ณ ์ž ํ•œ๋‹ค. ์œ„ ๊ตฌ์กฐ์ฒด ์ฒ˜๋Ÿผ score๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋  ์ˆ˜ ๋„ ์žˆ๊ณ , ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์ •๋ ฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. `idx`์˜ ๊ฒฝ์šฐ, PQ์— push, pop์„ ํ•  ๋•Œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ, PQ์— update, e..

C: Signal

Signal ์ธํ„ฐ๋ŸฝํŠธ๋Š” ์–ธ์ œ ๋ฐœ์ƒํ• ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋น„๋™๊ธฐ์ (Asynchronous) ์ด๋ฒคํŠธ๋ผ๊ณ  ํ•˜๋ฉฐ, ์‹œ๊ทธ๋„์€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์ธํ„ฐ๋ŸฝํŠธ๋Š” ํฌ๊ฒŒ H/W, S/W ์ธํ„ฐ๋ŸฝํŠธ๋กœ ๋‚˜๋‰œ๋‹ค. ์‹œ๊ทธ๋„์€ S/W ์ธํ„ฐ๋ŸฝํŠธ์ด๋‹ค. ์‹œ๊ทธ๋„ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๋”๋ผ๋„, ์‹œ๊ทธ๋„์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌด์‹œ๋œ๋‹ค. ๋‹จ `SIGKILL`, `SIGSTOP`์€ ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋‹ค. ์‹œ๊ทธ๋„์˜ ์ข…๋ฅ˜๋Š” `kill -l`์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. fork, exec์— ๋”ฐ๋ผ ์‹œ๊ทธ๋„์€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. fork๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ทธ๋กœ ๋ณต์ œํ•˜๋ฏ€๋กœ, ๋™์ผํ•œ ์‹œ๊ทธ๋„์„ ์ƒ์†๋ฐ›๋Š”๋‹ค. exec์˜ ๊ฒฝ์šฐ SIGTERM์€ ์ƒ์†๋ฐ›์ง€ ์•Š๋Š”๋‹ค. SIGKILL #!/bin/bash if [ -z $1 ]; then echo "..

C: thread safe and reentrant

thread safe๋Š” ๋‹จ์ˆœํžˆ ์šฉ์–ด๋งŒ ๋ณด๋”๋ผ๋„, thread ํ™˜๊ฒฝ์—์„œ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ตฌ๋‚˜๋ผ๋Š” ๊ฒƒ์„ ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ reentrant๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๊ณผ๊ฑฐ์—๋Š” reentrant์™€ thread safe๋ฅผ ํ˜ผ์šฉํ•˜์—ฌ ์“ฐ๋Š” ์ฑ…๋“ค๋„ ๋”๋Ÿฌ ์žˆ์—ˆ๋‹ค. ์ด์—, ์ด ๋‘˜์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ณ  ์ดํ•ดํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. thread safe `thread safe`๋Š” ๋ง ๊ทธ๋Œ€๋กœ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋„ ์›๋ž˜ ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด `critical section`์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ, ์Šค๋ ˆ๋“œ ๋ณ„๋กœ ๋™๊ธฐํ™”๋ฅผ ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฉด ์›์น˜ ์•Š๋Š” ๊ฒฐ๊ณผ์™€ ์ง๋ฉดํ•˜๊ฒŒ ๋œ๋‹ค. char arr[10]; int idx = 0; int func(char c) { int i = 0; if (idx >= sizeof(arr))..

๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€