렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 시스템에 따른 데이터 타입의 차이 사용하는 시스템(ARM, POSIX)에 따라 같은 데이터 타입이라고 하더라도 크기가 다를 수 있다. 이를 인지하지 못하고 코드를 작성한다면 원치 않는 결과를 초래한다. 예를 들어 64bit 리눅스 시스템에서 정상 동작하던 코드가 윈도우 32bit에서는 동작하지 않을 수 있다. #include int main() { unsigned int a, b; unsigned long c; a = 100000000; b = 1001; c = (unsigned long)a * b; printf("c = %lu\n", c); return 0; }..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 연산자 우선순위 연산자 우선순위를 알지 못하고, 적절히 활용하지 못한다면 원치 않는 결과를 초래할 수 있다. 포인터를 사용하더라도 `()`에 따라 다른 결과를 만들게 된다. #include int main() { int *p; int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; p = num; *p++; (*p)++; *++p; ++*p; return 0; } 간단한 코드이지만 연산자의 우선순위를 모른다면, 위의 코드가 어떤 결과를 반환하게 되는지 알 수 없을 것이다. `*p++` 포인터가 가르키는 위치를 1 증가시킨다. 이는 `*` 보..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. Constant C언어에서 상수는 `macro`, `const`, `enum`으로 나타낼 수 있다. 이 역시 적절히 사용하지 않으면 편의성을 얻지만 오버헤드를 발생시키거나, 원치 않는 결과를 만들어 낼 수 있다. 만약, `const int size = 3`을 재귀 함수 내에 선언하면 어떨까? 함수가 호출 될 때마다 const가 선언되고 해제 되므로 오브헤드가 되게 된다. 또한 `switch`에서는 `const`를 사용할 수 없다고 배열원소의 개수(index)로도 사용할 수 없다. 이를 해결하기 위해서는 `enum`을 통해 상수를 선언하여야 한다. 명시적 관계 선언..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. macro function 매크로 함수는 컴파일 전에 전처리기에 의해 텍스트로 치환이 된다. 또한 `argument`의 타입 제한이 없다는 특징을 가지고 있다. 이로써 매크로 함수는 편리함을 제공하지만, 간과할 경우 올바르지 않은 결과를 반환하므로 주의하여 사용하여야 한다. Side effect #include #define TEST(X) ((X) * (X)) int main() { int i = 1; int a = TEST(++i); } 간단하게 생각했을 때, 해당 코드는 `TEST(X)`에 `++i`값을 대입한다면 4라는 값이 반환될 것이라고 생각한다. 하지만..
문제 10422번: 괄호 ‘(‘, ‘)’ 문자로만 이루어진 문자열을 괄호 문자열이라 한다. 올바른 괄호 문자열이란 다음과 같이 정의된다. ()는 올바른 괄호 문자열이다. S가 올바른 괄호 문자열이라면, (S)도 올바른 괄호 www.acmicpc.net 문제 풀이 괄호의 문자열이 주어질 때, 올바른 괄호인지 찾는 문제이다. 이 문제는 `DP`로도 풀 수 있지만, 카탈랑 수로도 풀 수 있다. 카탈랑 수는 이진트리의 수를 셀 때 사용하는 수열이다. 카탈랑 수를 파이썬 코드로 나타내면 `factorial(2 * num) // (factorial(num) * factorial(num + 1))`이다. 이를 통해 문제를 해결할 수 있다. 코드 from math import factorial from sys impo..
문제 코딩테스트 연습 - 보석 쇼핑 ["DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"] [3, 7] programmers.co.kr 문제 풀이 진열된 보석들 중 모든 종류의 보석을 적어도 1개 이상 포함하는 가장 짧은 구간을 찾는 문제이다. 앞에서부터 순차적으로 탐색을 하게 되면 효율성을 통과할 수 없다. 고민을 하다가 솔루션을 참조하였는데, `투포인터`를 사용하여야 하는 문제였다. 구현하는 방식은 솔루션과 같이 구현하면, 문제를 해결할 수 있다. 평소 `투포인터`를 활용하는 문제를 다루어보지 않아 풀이를 보고 나서야 이해를 할 수 있었다.🤔 코드 def solution(gems): start, end = 0, 0 gem_num = l..
문제 코딩테스트 연습 - N으로 표현 programmers.co.kr 문제 풀이 특정한 숫자 `N`으로 사칙연산을 사용하여 `number`를 표현할 수 있는지 찾는 문제이다. 이때 `N`을 사용한 횟수가 가장 작은 경우를 찾아야 한다. 문제를 풀기 위해서는 `DP`를 통해서도 풀 수 있지만, `DFS`를 통해 풀더라도 간신히 통과할 수 있다. `DFS`를 통해 사용한 `N`의 수를 카운트하고, 카운트된 수가 8보다 크다면 더 이상 가지를 뻗을 필요 없이 종료하면 된다. 또한 만족하는 경우를 찾은 경우, 현재 찾은 카운트보다 `N`을 더 많이 사용한다면 가지를 뻗지 않으면 보다 시간을 단축시킬 수 있다. 코드 from math import inf answer = inf def dfs(n, cnt, num,..
문제 코딩테스트 연습 - 이중우선순위큐 programmers.co.kr 문제 풀이 주어진 연산 종류에 따라 큐에 연산을 삽입하고 삭제하는 과정을 진행한다. 연산의 종류에 따라 동작하는 과정은 다음과 같다. 명령어에 따라 큐에 숫자를 삽입하고, `D 1`인 경우 큐에서 최댓값을 삭제한다. 이와 달리 `D -1`인 경우 큐에서 최솟값을 삭제한다. 이는 별도로 `heapq`를 사용하지 않더라도 `list`를 통해 간단히 구현할 수 있다. 코드 def solution(operations): answer = [] for cur_op in operations: op, num = cur_op.split(' ') if op == 'I': answer.append(int(num)) elif answer: if num =..