렉토피아 정혜경 강사님의 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 =..
문제 코딩테스트 연습 - 징검다리 출발지점부터 distance만큼 떨어진 곳에 도착지점이 있습니다. 그리고 그사이에는 바위들이 놓여있습니다. 바위 중 몇 개를 제거하려고 합니다. 예를 들어, 도착지점이 25만큼 떨어져 있고, 바위가 programmers.co.kr 문제 풀이 출발지점부터 거리만큼 떨어진 곳에 도착지점이 있다. 이때 그 사이에 있는 바위들 중 몇 개를 제거하려고 한다. 특정 바위를 `N`개만큼 제거할 때 거리의 최솟값이 최대가 되는 경우를 구하는 문제이다. 이 문제는 문제의 분류와 같이 `이분 탐색`으로 해결할 수 있다. `이분 탐색`을 통해 최소값 기준으로, 빠진 돌의 개수를 카운트한 후 거리의 최솟값이 최대가 되는 경우를 찾으면 된다. 코드 from math import inf def ..
문제 코딩테스트 연습 - 가장 긴 팰린드롬 앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다. 문자열 s가 주어질 때, s의 부분문자열(Substring)중 가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요. 예를들 programmers.co.kr 문제 풀이 문자열이 주어질 때, 문자열의 부분 문자열 중 가장 긴 팰린드롬을 찾는 문제이다. 문제를 풀기 위해서는 `2중 반복문`을 통해 부분 문자열의 시작 위치와 끝 위치를 설정 후 팰린드롬인지 확인하면 된다. 코드 def solution(s): answer = -1 for i in range(len(s)): for j in range(i + 1, len(s) + 1): cur_string = s[i:..