프로그래머스 입문 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의 배수인지 확인한다.