포인터를 배우시면, 가장 머리가 아픈 부분이 함수 포인터일 겁니다. 교재에서는 아마 signal이랑, qsort를 예제로 많이 들 거에요. 사실 signal은 잘 안 쓰지만요. qsort는 비교체를 넘겨줄 때 함수 포인터를 넘겨주고요. 그런데, 이것이 대체 무엇을 하는 것일까요? 어떻게 실행되는지, 자세하게 분석을 하는 것은 아마도, 어셈블리랑 같이 하면서 이야기를 할 듯 싶어요. 오늘은 예제 코드만 간단하게 이해해 보도록 하겠습니다. 17줄짜리 프로그램입니다. func라는 변수를 선언했는데요. 이것이 무엇인지만 안다면, 끝난다고 보셔도 될 듯 싶습니다. 먼저, 6번째 줄에서, void (*func)() = foo; 라고 되어 있습니다. 선언부만 잘 보시면 되는데요. 시계 방향으로 해석하겠습니다. 먼저 ..
전체 글 검색 결과
실행 중인 프로세스의 pid와, 부모 프로세스의 pid를 얻어올 수 있는 방법이 없을까요? 각각 getpid 함수와 getppid 함수를 쓰시면 됩니다. 두 개 함수의 원형은 아래와 같습니다. 이제 예제 프로그램을 2개 보도록 하겠습니다. 먼저, 1번째 프로그램입니다. fork 함수로 자식 프로세스를 생성합니다. 그리고, pid가 0이면, 앞에 C를 출력하고, 그것의 프로세스 번호와, 부모의 번호를 출력합니다. 그렇지 않으면, 앞에 P를 출력하고, 프로세스 번호와, 부모 번호를 출력합니다. fork 함수의 리턴값이 0이라면 자식이고, 현재 실행중인 pid 값이면 부모이니, 어떻게 실행이 될 지는 대략 예측이 가능하실 거라고 생각이 듭니다. 실행 결과를 봅시다. 그러면 3373번이, 3374번을 생성을 했..
코딩 테스트를 보기 위해서는, 기본적으로 제한 조건을 읽을 줄 알아야 합니다. 단순히 n이 30보다 작고 m이 15보다 작은 조건이 들어오는군이 아니라, 왜 출제자가 이런 조건을 주었는지 곰곰히 생각해 보자는 것입니다. 이게 그렇게 어렵지 않은 것 같지만, 저는 솔직히 쉽지 않았습니다. 문제를 읽고 바로 이거네? 하고 들어가는 습관이 있다 보니, 이런 세세한 조건을 놓치는 경우가 다반사였습니다. 코테에서 이런 일이 발생했다면 탈락하실 확률이 높아집니다. 왜 제가 코테에서 물을 많이 먹었는지 단박에 알 수 있는 무서운 말입니다. 사실 조언해 줄 실력도 못 되지만, 작년에 물을 많이 먹으면서 제가 부족했던 점을 복기해 보았습니다. 그렇게 생각해 주시면 좋을 듯 싶습니다. 자. 그러면 어떻게 조건을 분석해야 ..
이번 글에서는, C언어 rand 함수와 srand 함수에 대해서 알아보도록 하겠습니다. 이들에 대한 자세한 원리는 추후에 따로 알고리즘이나 이산수학 카데고리에서 다룰 기회가 있을 듯 싶습니다. 먼저, srand는 1번째 인자로 seed 값만을 받습니다. 그리고, rand 함수는 아무런 인자를 받지 않고, 그냥 (유사)난수만 리턴합니다. 사용법은 그리 복잡하지 않은 듯 싶으니, 프로그램을 한 번 실행시켜 보도록 합시다. 먼저, 시드 값을 0으로 주고, rand 함수를 10번 호출해 보았습니다. 그랬더니, 1804289383, 846930886, ... , 1189641421이 나왔음을 알 수 있어요. 프로그램을 여러 번 실행 시켜도 동일한 결과가 나왔습니다. 그것으로 미루어 보았을 때 처음 시드값에 따라서..
오늘은 2019년 마지막 날이니, 마지막 날을 장식할 만한 포스트를 작성하도록 하겠습니다. 아래 수식의 결과 값을 10억 7로 나눈 나머지는 얼마일까요? 단, n은 2이상, 10^6 이하 자연수입니다. n = 10^6이면 대충 O(n)이나, O(128n)에 돌려도 무난할 복잡도입니다. 이것이 생각보다 꽤 큰 힌트 중 하나입니다. 먼저, 최대 공약수에 대한 관점을 비틀어 봅시다. a와 b의 최대 공약수가 g였다고 해 봅시다. 이걸 P라고 합시다. 그러면 위 수식이 성립합니다. 그런데 정말 그럴까요? 위 수식을 Q라고 해 봅시다. 만약에, gcd(a/g,b/g)의 값이 c이고, 이 값이 1이 아니라면, gcd(a,b)의 값은 gc가 됩니다. c가 1이 아니므로, gc의 값은 g가 아닙니다. 즉, not Q이..
최근댓글