N Log

프로그래머스 입문 120825 문자 반복 출력하기

문제

출처

매개변수로 전달되는 문자열 my_string은 영어 대소문자로만 이루어져 있다.
my_string의 각 글자를 매개변수 n만큼 반복해서 이어 붙인 문자열을 반환하시오.

예를 들어 my_string"hello"이고 n3이면 결과는 "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는 순차적으로 증가하는데, in의 배수가 될 때마다 몫이 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