문제 파일을 보았는데 in파일이 20개가 있었는데 엄청 긴 이진수였다. 또 문제 해설 ppt가 있었는데 문제를 간단히 요약하면 대칭인 수를 팬린드롬이라고 하는데 그 수 안에서도 대칭이 아닌 경우를 에러 값이라고 하고 해당 수에서 가장 큰 에러값을 출력하는 것이 문제다.
이를 풀기 위해 처음에는 문자열로 입력받고 문자열 길이만큼 계속 반복하려고 했는데 C언어에서 입력할 수 있는 최대값이 정해져 있어서 파일 입출력을 이용해보았다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int i, j;
int len;
int count, cnt, max_cnt = 0;
char* buffer = NULL;
FILE* fp = fopen("in20.txt", "r");
fseek(fp, 0, SEEK_END);
len = ftell(fp);
buffer = (char*)malloc((len + 1) * sizeof(char));
memset(buffer, 0, len + 1);
fseek(fp, 0, SEEK_SET);
count = fread(buffer, len, 1, fp);
printf("%s\\n", buffer);
printf("문자열 길이:%d\\n", len);
printf("count:%d\\n", count);
for (i = 0; i < len; i++) {
for (j = i + 1; j < len; j++) {
cnt = cnt_no_sym(i, j, buffer);
if (cnt > max_cnt)max_cnt = cnt;
}
// printf("%d\\n", max_cnt);
}
printf("답:%d\\n", max_cnt);
fclose(fp);
free(buffer);
return 0;
}
int cnt_no_sym(int start, int end, char* p) {
int i, j;
int middle, flag = 0;
middle = end - start;
middle /= 2;
for (i = start, j = end; i <= middle; i++, j--) {
if (*(p + i) != *(p + j)) {
flag = 1;
break;
}
}
if (flag == 1) return end - start + 1;
else return 0;
}
파일명도 반복문으로 했어야 했는데 그 생각을 못해서 20번을 수정하면서 코드를 돌렸다.
해당 값들을 다 더해주니 아래와 같이 나왔다.
36978 75347 37471 53356 28769 34689 64519 46397 0 24583 43609 29504 63095 96363 30478 87064 17983 68030 56859 74626
이 숫자들을 다 더해주니 969720 가 나왔다.
Solve
flag : SSF{969720}