본문 바로가기

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

[C] 코딩 테스트 입문 100제 (40 ~ 60)

1. 이차원 배열과 동적 할당 (malloc의 심화)

  • 이차원 배열 만들기: 일차원 배열을 n개씩 묶어 이차원 배열로 만드는 과정에서 int** 포인터를 다루는 법을 익혔다.
    • 복기: 첫 번째 malloc은 '행(Row)의 개수'만큼, 반복문 안의 두 번째 malloc은 '열(Col)의 개수'만큼 할당해야 한다.
  • 인덱스 매핑: answer[i][j] = num_list[k++] 공식을 통해 선형 데이터를 평면 데이터로 변환하는 감각을 익혔다.

2. 기하학 및 수학적 예외 처리

  • 삼각형의 완성조건: 가장 긴 변의 길이와 나머지 두 변의 합을 비교하는 로직. qsort로 정렬한 뒤 arr[2] < arr[0] + arr[1]로 판별하면 예외 없이 깔끔하다.
  • 피자 나눠 먹기(2): 인원수와 피자 조각(6조각)의 **최소공배수(LCM)**를 구하는 문제. 반복문을 돌며 (6 * i) % n == 0이 되는 지점을 찾는 최적화 로직을 복습했다.

3. 문자열 및 배열 조작의 디테일

  • 외계행성의 나이: (age[i] - '0') + 'a' 공식을 통해 아스키코드 오프셋(Offset)을 다루는 법을 마스터했다.
  • 배열 회전시키기: "left"면 첫 번째 원소를 보관했다가 뒤로 밀고, "right"면 마지막 원소를 보관했다가 앞으로 당기는 인덱스 조작이 핵심이었다.
  • 가위 바위 보: if-else 대신 switch문이나 매핑용 배열을 써서 각 상황(2->0, 0->5, 5->2)에 맞는 결과를 리턴하는 효율적인 구조를 고민했다.

4. 자료형과 정밀도 (옷가게 할인, 숫자 찾기)

  • 숫자 찾기: sprintf로 숫자를 문자열로 바꾼 뒤 target + '0'과 비교하는 방식. 이때 사람의 순서(1-based)와 컴퓨터의 인덱스(0-based) 차이로 인해 i + 1을 리턴해야 함을 잊지 말자.
  • 합성수 찾기: 이중 for문을 돌며 약수의 개수가 3개 이상인 수를 찾는 로직. 소수(Prime Number) 판별의 반대 개념을 정립했다.

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

  1. 메모리 해제(Free): malloc을 썼다면 반드시 free를 생각해야 하지만, 프로그래머스 환경에서는 시스템이 처리해주더라도 블로그 포스팅 시에는 '메모리 관리'의 중요성을 언급하자.
  2. 타입 캐스팅: double 연산 결과나 void*인 qsort 비교 함수 내부에서 (int*) 등으로 명시적 형변환을 해주는 습관이 버그를 줄인다.
  3. 경계값 테스트: hp가 딱 5의 배수일 때, 혹은 문자열의 길이가 1일 때 등 '끝단'의 데이터가 들어왔을 때 내 코드가 터지지 않는지 검토하는 습관이 생겼다.