c 언어 알고리즘 문제 입니다.
문제 출처:https://www.acmicpc.net/problem/2149
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <stdio.h> #include <string.h> #include <stdlib.h> void ssort(char*, int); //키 정렬. int *numbering(char*, char*, int); //정렬한 키에서 순서 뽑아내기. char *rearrange(char*, int, int*, int); //순서대로 암호문 재배열하기. int main(void) { int keyL, textL; char key[11] = {'\0',}, rearg_key[11] = {'\0',}, enctext[101] = {'\0',}; int *nums; char *plaintext; scanf("%s%s", key, enctext); keyL = strlen(key), textL = strlen(enctext); strcpy(rearg_key, key); ssort(rearg_key, keyL); nums = numbering(key, rearg_key, keyL); plaintext = rearrange(enctext, textL, nums, keyL); printf("%s", plaintext); free(plaintext); free(nums); return 0; } void ssort(char* str, int length) { //선택정렬. int i, j; char tmp; for(i=0; i<length-1; i++) { for(j=i+1; j<length; j++) { if(str[i] > str[j]) { tmp = str[i]; str[i] = str[j]; str[j] = tmp; } } } return; } int *numbering(char *original, char *transform, int length) { int i, j, cnt = 0; int *nums = (int*)calloc(length+1, sizeof(int)); for(i=0; i<length; i++) { for(j=0; j<length; j++) { if(transform[i] == original[j]) { nums[cnt++] = j; original[j] = '\0'; break; } } } return nums; } char *rearrange(char* str, int strL, int* nums, int numsL) { int i, j, cnt = 0; char *plaintext = (char*)calloc(strL+1, sizeof(char)); for(i=0; i<numsL; i++) { for(j=0; j<strL; j+=numsL) { plaintext[cnt++] = str[j + nums[i]]; //이부분이 문제라고 생각함. } } return plaintext; } | cs |
어느정도 되었다고 생각하는데 마지막 부분에서 아무리 생각하려고 해도 답이 안나오네요
프갤 형님들 존경합니다 ㅠㅜ
삽질그만하고 자자