2026/04/07 TIL
오늘의 목표
- 아침 코드카타
- 언리얼 강좌 1-5, 1-6, 1-7 수강
- 언리얼 과제 1번 풀어보기
추가 목표: 백준 브론즈 문제 2개 이상 풀기
아침 코드카타
[문제] 수박수박수박수박수박수?
길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.
- 수박수박수박수박수박수?
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
char* solution(int n) {
// 리턴할 값은 메모리를 동적 할당해주세요.
char* answer = (char*)malloc((2 * n) + 1);
for(int i = 1; i <= n; ++i){
if(i % 2 == 0){
answer + i = '수';
}
else {
answer + i = '박';
}
}
answer[2 * n] = '\0';
return answer;
}
원하는 크기에 맞게 메모리를 동적할당하고, for 반복문을 통해서 인덱스가 짝수이면 '수'를, 홀수이면 '박'을 저장하도록 작성했다.
[오류]
/solution0.c:10:26: error: character too large for enclosing character literal type
answer + i = '수';
^
/solution0.c:13:26: error: character too large for enclosing character literal type
answer + i = '박';
^
한글 문자여서 저장이 제대로 되지 않는 것 같다.
해결 방법을 모르겠어서 검색해보았다.
[풀이]
한글 문자는 2~3바이트를 사용하므로 그에 따라 공간을 지정해줘야 한다.
넉넉하게 각 문자당 3바이트로 공간을 설정해준다.
char* answer = (char*)malloc(n * 3 + 1);
각 문자 당 어느 정도의 공간을 차지할지 모르므로 문자열을 추가하는 함수를 사용한다.
<string.h>의 strcat
for(int i = 0; i <= n; ++i){
if(i % 2 == 0){
strcat(answer, "수");
}
else {
strcat(answer, "박");
}
}
[오류]
실행한 결괏값 "��VO수�"이 기댓값 "수박수"과 다릅니다.
이제 오류는 뜨지 않는데 문자열을 저장할 때 문제가 생기는 것 같다.
검색해보니 strcat는 문자열을 저장할 때 문자열의 길이를 처음부터 재서 비효율적이라고 한다. 대신 memcpy를 사용하고 마지막에 문자열 종료 문자 '\0'을 넣어주는 것이 더 효율적이라고 한다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
char* solution(int n) {
// 리턴할 값은 메모리를 동적 할당해주세요.
char* answer = (char*)malloc((n * 3)+ 1);
for(int i = 0; i < n; ++i){
if(i % 2 == 0){
memcpy(&answer[i*3], "수", 3);
}
else {
memcpy(&answer[i*3], "박", 3);
}
}
answer[n*3] = '\0';
return answer;
}
개념 정리
memcpy
메모리의 일부분을 복사함.
void *memcpy(void *dest, const void *src, size_t count);
src의 데이터를 dest로 count 바이트만큼 복사하고 dest를 반환한다.
완료한 것
아침 코드카타
언리얼 강좌 1-5~1-7 수강