์ปดํจํฐ์์ ๊ดํธ๊ฐ ํฌํจ๋ ์ฐ์ฐ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋, ์ค์ ํํ์(Infix)๋ณด๋ค ํ์ ํํ์(Postfix)์ ํตํด ๊ณ์ฐํ๋ฉด ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ Stack์ ํตํด ์ฝ๊ฒ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ๋ณํํ ์์ ๊ณ์ฐํ๋ ๊ฒ์ ์ด๋ ต์ง ์๋ค. Stack์ ์ฌ์ฉํ์ฌ ๊ตฌํ ํ์ ํํ์ ๋ณํ int priority(char c) { if (c == '(') return 0; else if (c == '+' || c == '-') return 1; // *, / ์ธ ๊ฒฝ์ฐ return 2; } string changePostfix(string target) { stack s; string prefix; for (int i = 0; target[i]; i++) { if (target[i] == '(') s.push..
c++์์ ๋ฌธ์์ด์ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ๋ ํฌ๊ฒ ๋ถ๋ถ๋ฌธ์์ด์ ๋ง๋๋ ๊ฒฝ์ฐ์ ํน์ ๊ตฌ๋ถ๋ฌธ์(delimiter)๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ๋๋๋ ๊ฒฝ์ฐ์ด๋ค. ์ด๋ ต์ง ์์ง๋ง, ๋ชจ๋ฅด๋ฉด ์ฝ์งํด์ผํ๋ ์ ๋ฆฌํด๋๊ณ ์ ํ๋ค. substr #include #include using namespace std; string getSubStr(string s, int len) { string subStr; vector subStr; // ์๋ฅผ ๊ธธ์ด for (register int end = 1; end < len; end++) { // ์๋ฅผ ์์น for (register int start = 0; start < len; start++) { subStr.push_back(s.substr(start, end)); } } return subStr;..
Trie๋ฅผ ๊ฐ๋ ๋ง ์๊ณ , ์๊ฐํด๋ณด๋ ์ง์ ๊ตฌํํด๋ณธ ์ ์ด ์์๋ค. ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด๋ฅผ ํ ๋, ์๊ธดํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. ๋ค๋ฅธ ๊ณณ์์ ๊ฒ์ํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ด ๋์ ์ผ๋ก ํ ๋นํ๋ ๊ฒ์ด ์๋, ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ง๊ฒ ์ ์ ์ผ๋ก Trie๋ฅผ ํ ๋นํด๋๊ณ , ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ค๋ฃจ๊ณ ์ ํ๋ค. Trie? ํธ๋ผ์ด (์ปดํจํ ) - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ "A", "to", "tea", "ted", "ten", "i", "in", "inn"๋ฅผ ํค๋ก ๋ ํธ๋ผ์ด. ์ด ์์ ์๋ ๋ชจ๋ ์์ ๋ ธ๋๊ฐ ์ํ๋ฒณ ์์ผ๋ก ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ๋ ฌ๋์ด ์์ง๋ ์๋ค. (๋ฃจํธ ๋ ธ๋์ 't' ๋ ธ๋) ํธ๋ผ์ด(trie)๋ ์ปดํจํฐ ko.wikipedia.org Trie๋ root๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ์ ์ฅํ ๋, ๊ฐ ๋ ธ๋์ ์ด๋ค ..
์ฝ๋ฉ ํ ์คํธ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ 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..
IPC(Inter-Process Cmmuniciation)๋ ํ๋ก์ธ์ค๋ค ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํ์, ๊ทธ์ ๋ํ ๋ฐฉ๋ฒ ๋๋ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๋ค. pipe์ ์ข ๋ฅ pipe๋ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ๋ก์ธ์ค์ ๋ฐ๋ผ write, read๋ฅผ ํ ์ ์๋ค. ๋ํ ๊ด๋ จ๋ ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ๋ pipe์ ๊ด๋ จ ์๋ ํ๋ก์ธ์ค ๊ฐ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ named pipe๋ก ๋๋๋ค. pipe int process_pipe(pid_t pid, int *pipe_p, char *buf) { int status; if (pid == 0) { /* child process */ close(pipe_p[1]); read(pipe_p[0], buf, sizeof(buf)); printf("%d get msg %s\n", pid, buf); clo..
High-level API struct info { char ch[10]; int digit; }; int write_info(struct info *i) { FILE *fp = NULL; if (!(fp = fopen("/test", "w"))) return -1; if (fwrite(i, sizeof(struct info), 1 fp) != 1) { fclose(fp); return -1; } fclose(fp); return 0; } int read_info() { FILE *fp; struct info i; if (!(fp = fopen("/test", "r"))) return -1; if (fread(i, sizeof(struct info), 1) != 1) { fclose(fp); return..
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 "..
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))..