N Log

프로그래머스 입문 120892 암호 해독

문제

출처

암호화된 문자열 cipher에서 code의 배수 번째 글자만 읽어 숨겨진 문자열을 만드시오.

cipher code result
“dfjardstddetckdaccccdegk” (24) 4 “attack” (6)
“pfqallllabwaoclk” (16) 2 “fallback” (8)

괄호 안의 숫자는 원문에 없는 값으로, 문자열의 길이를 따로 표시한 것이다.

풀이

문자열 인덱스는 0부터 시작하지만, 문제에서 말하는 code의 배수 번째는 1부터 센 위치이다.
두 기준의 시작점이 다르므로 이를 어떻게 맞출지가 이 문제의 핵심이다.

code가 4일 때 문자열을 4개씩 한 묶음으로 나누어 보면 다음과 같다.

 d  f  j  a |  r  d  s  t |  d  d  e  t |  c  k  d  a |  c  c  c  c |  d  e  g  k
 0  1  2  3    4  5  6  7    8  9 10 11   12 13 14 15   16 17 18 19   20 21 22 23
 1  2  3  4    5  6  7  8    9 10 11 12   13 14 15 16   17 18 19 20   21 22 23 24

꺼내야 할 문자의 인덱스는 n * code - 1이다.
즉 4개씩 묶었을 때 꺼내야 할 문자는 각 묶음의 마지막 위치에 있다.

이를 이용하면 널 문자를 제외한 result의 길이가 len / code라는 것을 알 수 있다.

문자열 길이가 25, 26, 27이어도 완전한 4개 묶음이 하나 더 생기지는 않으므로 완성되는 result의 길이는 6이다.

24 / 4 = 6
25 / 4 = 6
26 / 4 = 6
27 / 4 = 6
28 / 4 = 7

간격만큼 건너뛰기

#include <stdlib.h>
#include <string.h>

char* solution(const char* cipher, int code)
{
    int len = strlen(cipher);
    int idx = 0;
    char* result = malloc(sizeof(char) * (len / code + 1));

    for (int i = code - 1; i < len; i += code)
    {
        result[idx++] = cipher[i];
    }

    result[idx] = '\0';

    return result;
}

code는 1부터 센 위치이므로, 처음 꺼내야 할 문자의 인덱스는 code - 1이다.
code가 4라면 3번 인덱스가 첫 번째로 꺼낼 문자이다.
그다음 꺼낼 문자는 7, 11, 15번 인덱스로 이어진다.
따라서 code만큼 건너뛰면서 필요한 문자를 꺼낸다.

배수 번째인지 확인하기

#include <stdlib.h>
#include <string.h>

char* solution(const char* cipher, int code)
{
    int len = strlen(cipher);
    int idx = 0;
    char* result = malloc(sizeof(char) * (len / code + 1));

    for (int i = 0; i < len; i++)
    {
        if ((i + 1) % code == 0)
        {
            result[idx++] = cipher[i];
        }
    }

    result[idx] = '\0';

    return result;
}

전체 문자열을 순회하면서 code의 배수 번째 문자만 result에 담는다.
code는 1부터 센 위치이지만 배열 인덱스는 0부터 시작한다.
따라서 i + 1로 기준을 맞춘 뒤 code의 배수인지 확인한다.