이번 구간은 문자열의 특정 패턴을 찾거나, 대소문자를 변환하고, 배열 안의 숫자를 다루는 로직이 주를 이루었다. 특히 ctype.h 라이브러리의 유용함을 다시 한번 체감한 회차였다.
1. 문자열 검색과 필터링 (strstr vs !=)
- 문자열 안의 문자열: 특정 단어가 포함되어 있는지 찾을 때는 strstr을 사용했다. 반환값이 NULL인지 아닌지로 포함 여부를 판단하는 것이 핵심.
- 특정 문자 제거: '모음 제거'나 '특정 문자 제거' 문제에서는 새로운 배열(answer)을 만들고, 원본을 돌면서 조건에 맞지 않는 문자만 answer[k++] 형태로 옮겨 담았다.
- 복기: 이때 결과 배열의 인덱스 k를 증가시키는 것을 까먹으면 데이터가 덮어씌워지니 주의하자.
2. 문자와 숫자의 경계 허물기
- 숨어있는 숫자의 덧셈: isdigit 함수로 숫자 형태의 문자를 찾아낸 뒤, my_string[i] - '0' 공식을 써서 실제 정수로 변환해 더했다. atoi를 쓰는 것보다 훨씬 빠르고 간결하다.
- 자릿수 더하기: 숫자를 10으로 나눈 나머지(% 10)를 더하고, 숫자를 10으로 나누는(/ 10) 과정을 반복하여 각 자릿수를 분리했다.
3. 아스키코드와 대소문자 변환
- 대문자와 소문자: isupper와 islower로 판별하고, 대문자면 +32, 소문자면 -32를 하여 변환했다.
- 복기: 숫자 32를 직접 쓰는 것보다 c + ('a' - 'A') 처럼 표현하는 것이 훨씬 가독성이 좋다.
4. 메모리 초기화와 안전성
- 홀수 짝수 개수: int answer[2] 공간을 malloc으로 만들고 memset으로 초기화할 때, sizeof(int) * 2 바이트만큼 정확히 초기화해야 쓰레기 값으로 인한 오류를 막을 수 있다.
- 최댓값과 인덱스: answer[0]에는 값을, answer[1]에는 인덱스를 담았다. 초기값을 array[0]으로 설정하여 음수 범위까지 대비하는 습관을 들였다.
💡 스스로 주는 피드백 (자주 틀리는 포인트)
- 반환값의 위치: 제곱수 판별 같은 문제에서 answer = 2를 루프 밖 맨 밑에 두면, 안에서 1을 찾았더라도 결국 2로 덮어씌워진다. found 같은 플래그 변수를 쓰거나 조건에 맞을 때 즉시 return 하는 구조가 안전하다.
- 문자열 끝의 약속: malloc으로 만든 문자열 배열은 반드시 마지막에 answer[k] = '\0';을 해줘야 한다. 이걸 안 하면 출력 시 메모리 끝까지 읽어버리는 '버퍼 오버런'이 생긴다.
- 포인터 참조 오류: int* max = answer[0] 처럼 값을 주소로 착각하지 말자. 배열 인덱스 접근은 그 자체로 변수 접근이다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
| [C] 코딩 테스트 입문 100제 (84 ~ 100) (0) | 2026.04.01 |
|---|---|
| [C] 코딩 테스트 입문 100제 (72 ~ 83) (0) | 2026.03.30 |
| [C] 코딩 테스트 입문 100제 (61 ~ 71) (0) | 2026.03.27 |
| [C] 코딩 테스트 입문 100제 (40 ~ 60) (0) | 2026.03.26 |
| [C] 코딩 테스트 입문 100제 (1 ~ 26) (0) | 2026.03.23 |