문제 파일을 보았는데 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}