프로그래머스 입문 120825 문자 반복 출력하기
문제
매개변수로 전달되는 문자열 my_string은 영어 대소문자로만 이루어져 있다.
my_string의 각 글자를 매개변수 n만큼 반복해서 이어 붙인 문자열을 반환하시오.
예를 들어 my_string이 "hello"이고 n이 3이면 결과는 "hhheeellllllooo"가 된다.
풀이
중첩 반복문으로 문자 채우기
#include <stdlib.h>
#include <string.h>
char* solution(const char* my_string, int n)
{
int len = strlen(my_string);
int idx = 0;
char* answer = (char*)malloc(sizeof(char) * (len * n + 1));
for (int i = 0; i < len; i++)
{
char ch = my_string[i];
for (int j = 0; j < n; j++)
{
answer[idx++] = ch;
}
}
answer[idx] = '\0';
return answer;
}
새로운 문자열을 만들어서 반환해야 하므로 동적 할당한다.
원래 문자열의 각 문자를 n번씩 반복하면 결과 문자열의 길이는 문자열 길이 * n이 된다.
여기에 문자열의 끝을 표시하는 널 문자까지 저장해야 하므로 할당 크기는 문자열 길이 * n + 1이 된다.
결과를 담을 배열이 준비되었으니 원래 문자열의 각 문자를 차례대로 처리한다.
문자 하나를 선택한 뒤 안쪽 반복문에서 그 문자를 n번 대입한다.
이 과정을 모든 문자에 대해 반복하면 최종적으로 반환할 문자열이 완성된다.
인덱스 나눗셈으로 문자 선택하기
#include <stdlib.h>
#include <string.h>
char* solution(const char* my_string, int n)
{
int len = strlen(my_string);
int size = len * n;
char* answer = (char*)malloc(sizeof(char) * (size + 1));
for (int i = 0; i < size; i++)
{
answer[i] = my_string[i / n];
}
answer[size] = '\0';
return answer;
}
전체 반복 횟수는 문자열 길이 * n으로 같지만, 중첩 반복문 대신 하나의 반복문으로 처리한다.
핵심은 my_string에서 어떤 문자를 가져올지 결정하는 i / n이다.
i는 순차적으로 증가하는데, i가 n의 배수가 될 때마다 몫이 1씩 커진다.
그래서 같은 몫이 n번 반복되고, 같은 문자가 결과 배열에 n번 연속으로 저장된다.
i / 3의 값은 my_string에서 가져올 문자의 인덱스가 된다.
my_string이 "hello"이고 n이 3이면 다음과 같이 동작한다.
i 범위 |
i / 3 |
가져오는 문자 |
|---|---|---|
| 0 ~ 2 | 0 | h |
| 3 ~ 5 | 1 | e |
| 6 ~ 8 | 2 | l |
| 9 ~ 11 | 3 | l |
| 12 ~ 14 | 4 | o |