본문 바로가기

코딩테스트/프로그래머스

[C] 코딩 테스트 입문 100제 (1 ~ 26)

1. 실수(Float)와 정수(Int) 사이의 형 변환

C언어에서 가장 기초적이면서도 놓치기 쉬운 부분이다.

  • 나눗셈 오차 주의: int끼리 나누면 소수점이 증발한다. 정확한 비중이나 값을 구할 땐 반드시 한쪽을 (double)이나 (float)로 캐스팅해야 한다.
    • 예: (float)num1 / (float)num2 * 1000
  • 평균 구하기: 합계는 int로 계산하더라도, 평균은 double로 반환해야 하므로 마지막 계산에서 형 변환이 필수다.

2. 동적 메모리 할당의 정석 (malloc, realloc)

Python과 달리 C는 결과 배열의 크기를 직접 지정해줘야 한다.

  • 배열 자르기/뒤집기: malloc을 쓸 때 (필요한 개수) * sizeof(int) 공식을 사용한다.
    • len = num2 - num1 + 1 처럼 인덱스 범위를 정확히 계산하는 게 핵심.
  • 문자열 끝 처리: 문자열을 뒤집거나 복사할 땐 널 문자(\0) 공간을 위해 strlen + 1만큼 할당하고, 마지막에 직접 \0을 넣어줘야 출력 에러가 안 난다.
  • 크기 최적화 (realloc): 'n의 배수'처럼 결과 개수를 미리 모를 땐, 일단 최대치로 할당한 뒤 realloc으로 줄여주는 게 메모리 관리 면에서 훨씬 깔끔하다.
    • 주의: realloc 실패를 대비해 임시 포인터(temp)를 거쳐서 대입하는 습관을 들이자.

3. 문자열 비교는 무조건 strcmp

  • if (s1[i] == s2[j])는 주소값을 비교하는 대참사를 부른다.
  • 문자열의 '내용'이 같은지 보려면 string.h의 strcmp()를 써서 결과가 0인지 확인해야 한다.

4. 정렬 알고리즘 활용 (qsort)

  • 최댓값 찾기나 키 비교 문제에서 for문을 여러 번 돌리기보다 qsort로 먼저 정렬해두면 로직이 단순해진다.
  • compare 함수 작성 시 포인터 형 변환(*(int*)a) 순서에 익숙해질 것.

💡 스스로 주는 피드백 (자주 틀리는 포인트)

  1. 연산자 우선순위: malloc(len + 1 * sizeof(char))는 의도와 다르게 작동할 수 있다. 항상 (len + 1) * sizeof(char)로 괄호를 치자.
  2. 예외 처리: malloc 후에는 항상 if (arr == NULL) 체크를 해서 메모리 할당 실패 상황을 방지하자.
  3. 반환값 타입: 포인터 반환 함수에서 에러 시 -1보다는 NULL을 반환하는 것이 더 안전하고 관례적이다.