2026/04/06 TIL
오늘의 목표
- 아침 코드카타
- 언리얼 강의 수강
아침 코드카타
[문제] 가운데 글자 가져오기
주어진 스트링 s의 가운데 글자를 가져오는 문제이다.
이번에는 최대한 검색 없이 기억만으로 문제를 풀어보려고 했다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* s) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
char* answer = (char*)malloc(1);
char* word = (char*)malloc(100);
int len = 0;
for(int i = 0; *(s + i) != '\0'; ++i){
word = word + *(s + i);
++len;
}
realloc(answer, (char*)malloc(100));
return answer;
}
그런데 char* 배열을 c언어에서 어떻게 순환했는지 기억이 안 나서 아주 큰일이 났다.
일단 char* 배열 마지막에 '\0'이 들어있는 걸 이용해서 순환해보려고 했는데, 순환이 잘못되었는지 core dump 오류가 떠서 곤란했다.
이후 검색해서 문제를 풀어보았다.
<구상>
substring을 만드는 함수를 이용해서 중간값을 알아내보고 싶다.
일단 char*의 길이를 알아내서 절반 위치의 인덱스가 몇인지 알아낸 후, 해당 인덱스의 글자만 substring로 떼 오는 방식으로 코드를 써보겠다.
<풀이>
char* 길이를 알아내는 법
<string.h> 헤더의 strlen() 함수를 사용하면 된다.
int len = (int)strlen(s);
그 후 만약에 len이 짝수라면 (len % 2 == 0)
answer을 realloc으로 재할당해주고, len / 2 - 1 부터 len / 2 까지의 숫자를 strncpy로 분리해낸다.
len이 홀수라면 strncpy로 len / 2를 분리해낸다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* s) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
char* answer = (char*)malloc(1);
int len = (int)strlen(s);
if(len%2 == 0){
realloc(answer, sizeof(char) * 3);
strncpy(answer, s + (len / 2) - 1, 2);
}
else {
strncpy(answer, s + (len / 2), 1);
}
return answer;
}
[오류]
실행한 결괏값 "c\u000b�w�"이 기댓값 "c"과 다릅니다.
뒤에 쓰레기값이 붙어서 나오는 것을 알 수 있다.
아마 answer 뒤에 문자열 종료 문자가 없어서 그런 것 같으니 문자열 종료 문자를 추가해준다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* s) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
char* answer = (char*)malloc(1);
int len = (int)strlen(s);
if(len%2 == 0){
realloc(answer, sizeof(char) * 3);
strncpy(answer, s + (len / 2) - 1, 2);
*(answer + 2) = '\0';
}
else {
realloc(answer, sizeof(char) * 2);
strncpy(answer, s + (len / 2), 1);
*(answer + 1) = '\0';
}
return answer;
}
사용한 함수 개념 정리
c언어 기반
strlen(string s) : string (char *)의 길이를 구하는 함수
size_t strlen(const char *str);
malloc : 동적 할당 함수
void* malloc(size_t size);
realloc : 이미 할당된 메모리 재할당
void* realloc(void* ptr, size_t size);
strncpy: string의 특정 부분을 카피
char* strncpy(char* destination, const char* source, size_t num);
언리얼 강의 수강 (완료)