게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C) 알고리즘 문제 오답이 발생하는 이유가 뭘까요? (코드 김 주의)
게시물ID : programmer_18321짧은주소 복사하기
작성자 : 훗날닭집사장
추천 : 0
조회수 : 508회
댓글수 : 3개
등록시간 : 2016/08/31 21:23:51
옵션
  • 본인삭제금지
우선 알고리즘 문제에 대한 링크입니다.
 
https://www.acmicpc.net/problem/11070
 
코드가 길어 죄송합니다 최대한 세세하게 주석을 달아놓겠습니다.
또 본래 표준입출력으로 해야하나 우선 파일입출력 형식으로 했습니다 (이것 때문에 오답처리 되는것은 아닌게
파일입출력의 경우 정답이여도 런타임 에러가 발생하는데 이 코드는 아예 틀렸습니다 라는 오답문구가 나옵니다. ㅠㅠ)
 
#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개의 득/실점을 활용하는 식으로 접근해봤습니다.
 
이렇게 하니 입력예제를 변경해도 값은 제대로 뜨는데, 채점에서는 오답이라고 계속 뜨는게 도통 이유를 모르겠어서 올려봅니다.
 
아예 싹 갈아엎어야 할 문제일까요? ㅠ.ㅠ
 
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호