본문 바로가기

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

[C] 코딩 테스트 입문 100제 (72 ~ 83)

이번 구간은 코드를 짜기 전, "어떻게 하면 더 적게 계산할까?"를 고민하게 만드는 문제들이 많았습니다.

1. 효율적인 수 체계 처리 (소인수분해, 7의 개수)

  • 소인수분해: 에라토스테네스의 체로 소수를 먼저 거른 뒤, while 루프로 나누어떨어지는 소인수만 추출했다.
    • 복기: 단순히 2부터 n까지 나누는 것보다 미리 소수 목록을 가진 상태에서 접근하는 것이 훨씬 체계적이었다.
  • 7의 개수: 정수를 문자열로 바꾸지 않고, % 10과 / 10 연산만으로 각 자릿수의 7을 찾아냈다.
    • 복기: 숫자를 문자로 변환하는 오버헤드 없이 순수 산술 연산만 쓰는 것이 성능 면에서 유리하다.

2. 문자열 제어와 진법 연산 (이진수 더하기, 잘라서 배열로 저장하기)

  • 이진수 더하기: strtol 함수를 사용해 이진수 문자열을 십진수로 바꾸고 계산 후 다시 이진수로 변환했다.
    • 복기: strtol의 세 번째 인자인 base를 활용하면 복잡한 진법 변환 로직을 획기적으로 줄일 수 있다.
  • 잘라서 저장: strncpy와 주소 연산(str + i)을 결합해 일정 크기씩 메모리를 복사했다.
    • 복기: 2차원 배열 동적 할당 시 첫 번째 malloc은 반드시 포인터 크기(sizeof(char*))만큼 잡아야 함을 다시 확인했다.

3. 게임 로직과 경계 조건 (캐릭터의 좌표, 공 던지기)

  • 좌표 이동: xrange, yrange라는 한계선을 설정해 캐릭터가 맵 밖으로 나가지 못하게 제어했다.
    • 복기: 이동 후에 체크하는 것이 아니라, 이동하기 전 조건문을 통해 경계에 닿았는지 먼저 확인하는 것이 안전하다.
  • 공 던지기: 나머지 연산자(%)를 활용해 원형 배열 구조를 구현했다.
    • 복기: 루프를 k번 돌지 않아도 (k-1) * 2 % len이라는 수학 공식 하나로 O(1) 만에 답을 낼 수 있다.

4. 기하학과 규칙 찾기 (직사각형 넓이, 종이 자르기)

  • 직사각형 넓이: 2차원 배열에서 x, y 좌표의 max와 min을 찾아 변의 길이를 계산했다.
    • 복기: 네 점의 순서가 바뀌어도 max - min 로직은 항상 유효한 길이를 제공한다.
  • 종이 자르기: 복잡한 재귀 대신 (M * N) - 1이라는 규칙을 찾아냈다.
    • 복기: 때로는 코드보다 예시 데이터에서 패턴을 찾는 것이 훨씬 강력한 해결책이 된다.