본문 바로가기

전체 글

(30)
[CERT C/표현식] (5) NULL 체크의 중요성 의미 NULL은 포인터 변수가 잘못된 주소를 가리키지 않도록 위험성이 없는 0 번지 주소를 가지고 있어서 초기화를 하는 데 많이 쓰이곤 한다. 문자열과 포인터를 배워오면서 NULL의 개념에 대해서는 헷갈릴 수 밖에 없다. NULL 문자 ( \0 ), NULL pointer ( NULL ), NULL string ( "" )의 차이점에 대해서도 알아보자. 표기 설명 NULL 문자 "\0" 문자열의 끝을 의미하는 문자로 아스키 코드 값 '0'이다. NULL pointer NULL 0 번지를 의미하며 대부분 플랫폼에서 Read-Only 영역이나 예약 영역으로 보호받는 주소이다. 그러므로 잘못된 주소를 가리키지 않도록 위험성이 없는 0번지 주소를 가르키도록 초기화를 하는 것이다. NULL string "" 아무..
[CERT C/표현식] (4) 함수 반환 값의 중요성 의미 여러 API와 라이브러리에서 제공해주는 함수의 반환 값은 함수가 작업을 성공 또는 실패했는지를 판단할 수 있는 지표이다. 많은 사람들이 라이브러리를 사용할 때 사용하는 많은 함수들에 리턴값이 있고 그 리턴값들이 의미하는 값들을 처리해주는 것이 프로그램을 작성할 때 매우 중요하다. 동작 방식 man 명령어 (UNIX/LINNUX의 경우) 구글링, document를 통해 함수의 반환값을 확인하고 여러 상황에서 일어날 수 있는 반환값에 대한 처리를 해주어야한다. 문제 코드 1. 함수의 리턴 값을 반드시 확인하자 출력을 예상해보기 #include void myflush(); int main() { int age; printf("Input age : "); scanf("%d", &age); myflush()..
[CERT C/표현식] (3) 포인터 연산 수행의 중요성 의미 포인터 연산은 주소에 대해서 연산을 하는 것을 의미하는데, 포인터에 더해지는 값은 자동적으로 포인터가 가리키는 데이터형으로 조정된다. 동작 방식 포인터 연산의 특징 (1) 주소상수 + 정수형 상수(n) -> 주소 상수 + (n * 주소상수에 해당하는 기억공간의 크기) (2) 주소상수 - 주소상수 -> 주소에 해당하는 기억공간 간의 첨자차이가 된다. 문제 코드 1. 단축 평가 방식을 신경써서 AND, OR 연산자를 사용하자. 출력을 예상해보기 #include #include #include #define BUFFER_SIZE 5 int getNumber(int *); int main() { int p; int buffer[BUFFER_SIZE]; int *bufptr = buffer; while(bu..
[CERT C/표현식] (2) 단축 평가 방식의 중요성 의미 단축 평가(short-circuit evaluation) 방식은 AND와 OR 논리 연산자에서 자주 사용되는 방식으로 첫 번째 피연산자로 평가가 완료되면 두 번째 피연산자는 평가하지 않고 끝내는 평가 방식이다. 동작 방식 연산자 좌측 피연산자 우측 피연산자 AND 거짓인 경우 평가 안함 OR 참인 경우 평가 안함 ※ 첫 번째 피연산자 평가가 완료가 되어서 뒤에 있는 피연산자가 실행되지 않으면서 원하지 않는 동작이 발생할 수 있다. 문제 코드 1. 단축 평가 방식을 신경써서 AND, OR 연산자를 사용하자. 출력을 예상해보기 #include #include #include #define BUF_SIZE 25 int getString(const char *, char **); int main() { i..
[CERT C/표현식] (1) 연산자 우선순위의 중요성 의미 연산자 우선순위란, C 언어에서 사용되는 수 많은 연산자들의 연산 순서를 의미한다. 보통 +, -보다 *, / 가 우선이고 비트 연산자 우선순위 정도까지 생각을 하는 분이 많을 것이라고 생각하는데 우리가 코드에서 보는 모든 기호에 우선순위가 부여되어있고 그 우선순위를 이해하다보면 포인터, 배열 등의 개념의 이해에 큰 도움이 될 것이다. 동작 방식 순위 명칭 연산자 결합방향 1 1차 연산자 () [] . -> -> 2 단항 연산자 + - ! ~ (type) sizeof ++ -- & * 4 가법 연산자 + - 5 Shift 연산자 > 6 관계 연산자 = 7 등가 연산자 == != 8 bit 곱 연산자 & 9 bit 차 연산자 ^ 10 bit 합 연산자 | 11 논리곱 연산자 && 12 논리합 ..
[백준] 1103번 게임 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 무식하게(?) 4개의 방향으로 최대 250개의 좌표를 전부 방문하게 된다면, 재귀함수로 풀었을 경우에는 4250 이라는 천문학적 계산을 하게될 수가 있다. 300.C.20 -> 시간 초과 (2) DP 배열 정의 -> dp[x][y] : x, y 좌표부터 이동할 수 있는 최댓값을 메모이제이션 한다. 3. 제약 조건 ​ (1) 범위 밖을 나가는 경우 (2) H에 빠지는 경우 ​ 4. 어려운 부분 ​ (1) 헷갈릴 수 있는 곳으로 띄어쓰기가 안되어있는 숫자들과 char형을 받아서 처리하는 부분 -> string 배열로 받아서 처리 (2) 사이클이 발생하는 경우 무한 반복이 가능하므로 check을 해나가는 부분 -> 보통 예외 처리에서 ..
[백준] 1043번 거짓말 1. Approach (1) 재귀 + Union Find 알고리즘 으로 접근한다. 2. DP[N][M] : n 명의 사람이 m개의 파티를 참가할 때 지민이가 최대한 과장되게 이야기를 할 수 있는 파티 개수의 최댓값. ( 이 문제에서 시간이 충분해서 DP는 큰 의미가 없다 ) -> DP[N][4] : N행, 1 - 3 열까지의 정점까지는 오는데에 필요한 최소 비용 (3) 풀이 방법 해결 방법 : #UnionFind 알고리즘을 사용한다. ( #서로소집합 ) ​ (1) 진실을 알고있는 사람들과 같은 파티에 참가한 사람들을 모두 그래프로 잇는다. (2) 그래프가 이어진 사람들에게는 지민이가 과장된 이야기 ( 거짓말 )를 할 수가 없다. (3) 그래프가 이어진 사람들을 알고있는 사람들이라고 전부 생각하고 조건을 ..
[백준] 2662번 기업투자 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 1만원 단위로 최대 N ( = 300 )까지의 액수를 최대 M ( = 20) 개의 회사를 선택해야기 때문이다. 300.C.20 -> 시간 초과 (2) DP 배열 정의 -> DP[N][M] : M 기업에 N 금액의 투자를 했을 경우 얻을 수 있는 최대 이익금 (3) 풀이 방법 -> investment[현재 보유하고 있는 금액][투자금액]으로 해결할 수 있다. 최대 이익금을 얻었을 때 각 기업에 얼마룰 투자했을 때 얻을 수 있는지 그 상태를 출력해야하는 부분을 신경써야한다. 자세한 내용은 아래 소스 코드 주석을 참고하자. 2. Source Code #include #include #include #include #define MAXC..