코딩 테스트에서 next_permutation의 사용 빈도는 상당히 높을 겁니다. 특히 역량 테스트라고 불리는 것에서는요. 구현이 들어가면 대략 50% 정도는 조합, 순열 등에서 나오는데요. 그 때, 이전 순열이라던지 다음 순열을 구하기 위해서 쓰는 함수가 저 함수입니다. 이전 순열은 데이터를 조금 변형을 하면 구할 수 있고요. 그러면 이 함수가 어떻게 구현이 되어 있을까요? 만약에 레퍼런스 없이 구현하라고 하면 어떻게 해야 할까요? 단계별로 이해해 봅시다. 사실 이 함수의 복잡도는 O(n)입니다. 왜 그렇게 나올 수가 있는 것인지, 상대적으로 비효율적인 구현 방법으로 먼저 구현해 보고 이야기 하도록 하겠습니다. O(n^2)의 핵심 접근은, 결정 함수입니다. 이게 무슨 어려운 것이냐라고 생각하실 수도 있..
레퍼런스 검색 결과
memset 함수는 시작 주소값부터 sz 바이트만큼, 바이트 단위로 초기화를 해 주는 함수입니다. 보통 2번째 인자에 넣는 값이 0, -1인 경우가 상당히 많은데요. 0x3f나 0x7f 등도 ps에는 꽤 많이 쓰입니다. 그런데, 바이트 단위로 초기화를 하기 때문에, int형 배열이나 long long형 배열과 같은 경우, 배열에 memset 함수로 0, -1은 넣을 수 있는데, 2, 3과 같은 건 넣을 수 없습니다. 이런 건 조심해야 합니다. 사용 방법은 아래와 같습니다. void *memset(void *tar, int value, size_t sz); 요약하면, tar부터, sz byte만큼 바이트 단위로 value라는 값으로 초기화를 하겠다는 의미입니다. 먼저 예제 프로그램 1을 봅시다. 보시면 1..
STL을 공부하시다 보면, 반복자 무효화라는 용어는 한 번 쯤 들어보셨으리라 생각합니다. 반복자는 순회, 탐색 등을 위해서 쓰는 녀석인데요. 이것이 어떠한 이유로 무효화가 될 수 있습니다. 보통, iterator가 가리키는 것이 삭제 되었을 때 무효화가 되는데요. vector와 같이, 동적 배열을 사용할 때는 그 이외에도 조심해야 할 부분들이 몇 가지 더 있어요. 예제 프로그램 1을 봅시다. 먼저, 이 프로그램을 생각해 봅시다. vector v에 원소를 200개 추가했습니다. 그리고, 이 때, 벡터의 시작 원소를 iter가 가리키게 했습니다. 그리고 난 다음에, v에다가 0부터 1999까지 또 추가를 합니다. 프로그램에는, 벡터에 remove 연산을 가하지 않았습니다. 그런데 결과가 의외입니다. 0 0 ..
알고리즘에, 정렬 시리즈를 계속 올리고 있습니다. C언어에서도, 손쉽게 빠른 정렬을 쓸 수 있는데요. 에 빠른 정렬을 하는 qsort 함수가 있습니다. 이것의 원형은 다음과 같습니다. void qsort(void *base, size_t num, size_t size, int (*compare)(const void *,const void *)); 뭔가 원형이 복잡해 보이는데요. 특히 4번째 인자가 조금 복잡해 보입니다. 이게 무엇인지 천천히 해석해 보겠습니다. 먼저 identifier를 찾을 건데요. compare입니다. 오른쪽부터 볼 건데요. (나 )를 만날 때 까지 읽어요. compare 뒤에 바로 )가 있으니까, 왼쪽을 봅니다. 보는데 *가 있네요. 즉, compare is pointer라는 겁니다..
C언어의 strcpy는 문자열을 복사하는 함수입니다. 버퍼 오버플로우, BOF에 주의해야 하는 함수 중 하나입니다. 사용법은 다음과 같습니다. char *strcpy(char *dest,const char *ori); ori는 복사할 문자열, dest는 붙여 넣을 곳을 의미합니다. 그러면, 위치 ori부터 시작해서 널 문자를 만날 때 까지, dest부터 차례대로 복사한다는 의미가 되겠습니다. 몇 가지 예제를 보면서 이해해 보도록 하겠습니다. 먼저, src에 "aba"라는 것이 저장되어 있습니다. dest에 "aba"를 복사하려면 어떻게 쓰면 좋을까요? 복사할 문자열의 시작 위치는 src입니다. 이것을 노란색으로 표시해 보겠습니다. 그리고 복사가 시작될 위치를 초록색으로 표시해 보겠습니다. dest입니다...
최근댓글