우선 알고리즘 문제에 대한 링크입니다.
코드가 길어 죄송합니다 최대한 세세하게 주석을 달아놓겠습니다.
또 본래 표준입출력으로 해야하나 우선 파일입출력 형식으로 했습니다 (이것 때문에 오답처리 되는것은 아닌게
파일입출력의 경우 정답이여도 런타임 에러가 발생하는데 이 코드는 아예 틀렸습니다 라는 오답문구가 나옵니다. ㅠㅠ)
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable: 4996) // scanf 관련해서 발생하는 에러 C4996을 해소하기 위해 삽입했습니다
int main()
{
FILE *fp = fopen("Input.txt", "r");
int d, i, j, k, l; // 반복문을 위한 변수
int T; // 총 테스트케이스 반복 횟수
int m, n, a, b, p, q; // m = 경기 수 / n = 팀 수 / a,b = 대결을 하는 두 팀 / p,q = 두 팀의 득점
int goal = 0; // 총 득점
int miss = 0; // 총 실점
int twogoal = 0; // 득점 제곱
int twomiss = 0; // 실점 제곱
int MAX = 0; // 최대 기대값
int MIN = 0; // 최소 기대값
int **score = NULL; // 득,실점이 들어갈 2차원 배열 동적할당
float *W = NULL; // 기대값이 들어갈 1차원 배열 동적할당
if (fp == NULL)
{
printf("File Open Error.\n");
exit(1);
}
fscanf(fp, "%d", &T);
for (i = 0; i < T; i++)
{
fscanf(fp, "%d %d", &n, &m);
score = (int **)malloc(sizeof(int *) * m);
score[0] = (int *)malloc(sizeof(int) * n*m);
W = (float *)malloc(sizeof(float) * n);
for (d = 1; d < m; d++)
{
score[d] = score[d - 1] + n;
}
for (d = 0; d < m; d++)
{
for (l = 0; l < 2; l++)
{
score[d][l] = 0;
}
}
for (d = 0; d < n; d++)
{
W[d] = 0;
}
for (j = 0; j < m; j++)
{
fscanf(fp, "%d %d %d %d", &a, &b, &p, &q);
if ((a + b) > (m + n))
{
printf("파일 크기 에러.\n");
}
score[a - 1][0] += p;
score[a - 1][1] += q;
score[b - 1][0] += q;
score[b - 1][1] += p;
}
for (k = 0; k < n; k++)
{
goal += score[k][0];
miss += score[k][1];
twogoal = goal*goal;
twomiss = miss*miss;
if (goal == 0 && miss == 0)
{
W[k] = 0;
}
else
{
W[k] = (float)(1000 * twogoal / (twogoal + twomiss));
}
goal = 0;
miss = 0;
}
MAX = (int)W[0];
MIN = (int)W[0];
for (d = 1; d < n; d++)
{
if (MIN > W[d])
{
MIN = (int)W[d];
}
else if (MAX < W[d])
{
MAX = (int)W[d];
}
}
printf("%d\n%d\n", MAX, MIN);
MAX = 0;
MIN = 0;
}
fclose(fp);
free(score[0]);
free(score);
free(W);
return 0;
}
문제에 대해서 어떻게 접근하고자 했냐면
문제에서 입력예제를 보면 각각의 팀을 1번팀, 2번팀, 3번팀.. 등으로 지칭하는데
가령 1번팀의 총 득점이 10, 총 실점이 5라면
score[0][0] += 10
score[0][1] += 5
2번팀의 총 득점이 7, 실점이 4라면
score[1][0] += 7
score[1][1] += 4...
이런 식으로 n번째 배열마다 2개의 득/실점을 활용하는 식으로 접근해봤습니다.
이렇게 하니 입력예제를 변경해도 값은 제대로 뜨는데, 채점에서는 오답이라고 계속 뜨는게 도통 이유를 모르겠어서 올려봅니다.
아예 싹 갈아엎어야 할 문제일까요? ㅠ.ㅠ