작성일 : 11-07-11 14:15
2008년도 정올 전국대회 초등부 2번/중등부 1번 기출문제
 글쓴이 : 컴스쿨(hancomedu)
조회 : 10,088  

전체적인 흐름을 정확하게 잡고 제대로 훌륭하게 작성된거 같습니다.
컴퓨터 사양이 어떻게 되는지 모르겠지만 작성하신 프로그램으로 일부 문법 수정만 해서 정올에서 채점하면 충분하게 시간내에 출력이 되고 100점을 받으실 수 있습니다.
(전국대회 채점하는 컴퓨터는 정올보다 높은 사양입니다.)

시간을 더 줄일 수 있는 방법으로는 가지치기를 하면 되는데 이 경우에는 입력된 내용을 하나씩 확인하면서 만약 현재 저장된 값이 입력된 값을 초과하는 경우 더 이상 진행하지 않고 리턴을 해주는 방법으로 하면 상당한 시간을 줄일 수 있습니다. (물론 이 문제에서는 그럴 필요가 없습니다.)

참고로 보다 실력을 키우기 위해서는 코딩 습관을 몇가지 고쳐주는게 어떨까 생각합니다.
중요한 내용을 몇가지만 말씀드리면 다음과 같습니다.

1. for문 내에 int i와 같이 변수를 선언하는 것은 컴파일러에 따라서 컴파일 에러를 발생할 수 있으므로 가능하면 별도로 선언을 하는 것이 좋을 듯 합니다.

2. 전역변수로 선언을 하면 정수의 경우 기본값이 0으로 초기화 되므로 다시 최기화하기 위한 코딩은 불필요합니다.

3. main 함수에 return 0; 이 생략되어 있군요.

4. 재귀함수에서 b의 값에 따라 동일한 호출이 여러군데 분산이 되므로 프로그램이 복잡해 보입니다. 이런때는 그냥 한가지로 호출을 한 후에 재귀함수 내에서 보정을 해주면 프로그램이 무척 심플해 질 수 있습니다.

5. 최종적으로 확인을 하는 부분에서도 동일한 문장이 여러번 반복이 됩니다. 이런 경우에도 for문을 사용하여 동일한 문장을 하나로 줄이거나, 간단하게 확인하는 함수 하나를 작성하여 호출을 하면 프로그램이 무척 간단해 집니다.

참고로 두가지 형태로 수정한 소스를 올려드리니 참고하시기 바랍니다.

for문을 이용한 코딩

#include <stdio.h>
int w[5][7][4];
int c[7][4];
int chk[5];

void world(int a, int b)
{
 int i, j, k;
 if(b>6) {
  a++;
  b=a+1;
 }
 if(a==6) {
  for(i=1;i<=4;i++) {
   if(chk[i]==1) continue;
   chk[0]=1;
   for(j=1;j<=6;j++) {
    for(k=1;k<=3;k++) {
     if(c[j][k]!=w[i][j][k]) {
      chk[0]=0;
      break;
     }
    }
    if(chk[0]==0) break;
   }
   chk[i]=chk[0];
  }
  return;
 }
 c[a][1]++;  c[b][3]++;
 world(a,b+1);
 c[a][1]--;  c[b][3]--;

 c[a][2]++; c[b][2]++;
 world(a,b+1);
 c[a][2]--;  c[b][2]--;

 c[a][3]++;  c[b][1]++;
 world(a,b+1);
 c[a][3]--;  c[b][1]--;
}

int main()
{
 int i,j,k;
 FILE*fin = fopen("INPUT.TXT","r");
 for(i=1;i<=4;i++) {
  for(j=1;j<=6;j++) {
   for(k=1;k<=3;k++) {
    fscanf(fin,"%d",&w[i][j][k]);
   }
  }
 }
 fclose(fin);
 world(1,2);
 FILE*fout=fopen("OUTPUT.TXT","w");
 fprintf(fout,"%d %d %d %d",chk[1],chk[2],chk[3],chk[4]);
 fclose(fout);
 return 0;
}

check 함수를 이용한 코딩
#include <stdio.h>
int w[5][7][4];
int c[7][4];
int chk[5];

int check(int num)
{
 int chk=0, i, j;
 for(i=1;i<=6;i++) {
  for(j=1;j<=3;j++) {
   if(c[i][j]!=w[num][i][j]) {
    return 0;
   }
  }
 }
 return 1;
}

void world(int a, int b)
{
 int i;
 if(b>6) {
  a++;
  b=a+1;
 }
 if(a==6) {
  for(i=1;i<=4;i++) {
   if(chk[i]==0) chk[i]=check(i);
  }
  return;
 }
 c[a][1]++;  c[b][3]++;
 world(a,b+1);
 c[a][1]--;  c[b][3]--;

 c[a][2]++; c[b][2]++;
 world(a,b+1);
 c[a][2]--;  c[b][2]--;

 c[a][3]++;  c[b][1]++;
 world(a,b+1);
 c[a][3]--;  c[b][1]--;
}

int main()
{
 int i,j,k;
 FILE*fin = fopen("INPUT.TXT","r");
 for(i=1;i<=4;i++) {
  for(j=1;j<=6;j++) {
   for(k=1;k<=3;k++) {
    fscanf(fin,"%d",&w[i][j][k]);
   }
  }
 }
 fclose(fin);
 world(1,2);
 FILE*fout=fopen("OUTPUT.TXT","w");
 fprintf(fout,"%d %d %d %d",chk[1],chk[2],chk[3],chk[4]);
 fclose(fout);
 return 0;
}


황희선 11-07-11 14:37
 
선생님! 정말 감사합니다!
전역변수로 하면 되는지 모르고 있었네요ㅠㅠㅠㅠ
남은 5일동안 열심히 공부해서 좋은 결과내겠습니다!
저희 컴퓨터 사양이.. 몇년 전에 산 컴퓨터이기 때문에.. 좀 안좋은 것 같네요.
정올에 가서 쓰는 컴퓨터는 사양이 좋으면 좋겠네됴^^

그런데요, 선생님 대략적으로 생각하면, 몇건을 돌리게 되면 1초가 되나요?(정올 채점용 컴퓨터에서)
저희 컴퓨터는 3천만~5천만정도 돌리면 1초가 되더라고요;;
황희선 11-07-11 14:40
 
선생님!
첫번째 코드는 약 2초정도 걸리고;;
두번째 코드는 4초정도 걸리네요;;
커트가 0.5초여서 약 4배 정도 더 걸리는데,
저희 컴퓨터가 이상한 건가요? ㅎㅎ;;
황희선 11-07-11 14:43
 
으앜ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ;;
선생님! 3번째 올리네요;;
정올에서 채첨해 보니 저희 컴퓨터보다 10배나 더 빠르네요;;
마감이 0.2초 수준;;
저희 컴퓨터가 이상한가봐요;;ㅎㅎㅎ;;
컴스쿨 11-07-11 14:53
 
1초에 얼만큼 돌릴 수 있는지는 컴퓨터의 사양이나 연산의 내용등에 따라 판이하게 달라지기 때문에 정확하게 수치화 할 수 없습니다.
다만 웬만한 연산은 1억번 이상 가능하고 간단한 연산은 그 몇배도 나올수 있으나 대략 1억번 이상의 연산이 수행되는 경우에는 시간초과에 대비할 수 있도록 코딩하는 것이 좋습니다.
 
 

Total 635
번호 제   목 글쓴이 날짜 조회
55 올림피아드 강의 교재는 별도로 없는건지용~ (1) 한지민 08-27 8388
54 엑셀 완전초짜인데요 차트 만들기요..질문 (1) 정동명 08-25 8492
53 알고리즘 강좌 수강하고자 합니다. (1) 박수현 08-22 8830
52 알고리즘 강좌 신청합니다 (1) 이재성 07-13 7103
51 알고리즘 강의신청이요 (1) 김선미 07-13 6804
50 기하 알고리즘 강좌 질문 있습니다. (2) 황희선 07-11 7800
49 2008년도 정올 전국대회 초등부 3번문제 (1) 황희선 07-11 8092
48    2008년도 정올 전국대회 초등부 3번문제 (1) 컴스쿨 07-11 7864
47 2008년도 정올 전국대회 초등부 2번/중등부 1번 기출문제 (1) 황희선 07-10 7191
46    2008년도 정올 전국대회 초등부 2번/중등부 1번 기출문제 (4) 컴스쿨 07-11 10089
45 알고리즘 강의신청합니다~^^ (1) 황희선 07-10 6703
44 알고리즘 강의신청이요 (1) 김선미 07-08 6724
43 알고리즘 강의 신청 (1) 최현민 07-05 6692
42 교육신청과목어디서찾나요 (1) 안병태 06-29 6754
41 동영상 재생 (7) 김태경 06-28 6899
40 2006 전국 본선 1번 문제 (3) 금은실 06-27 7048
39 알고리듬 강의 신청 (1) 문일준 06-20 6858
38 알고리즘 강의 신처 (1) 이여진 06-15 7138
37 미디어 연결중 (2) 이수정 05-20 7586
36 Dyamic(동전 바꿔주기) (1) 김현수 05-19 13156
 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    

회사소개 | 개인정보처리방침 | 이용약관 | 찾아오시는 길 | 이메일주소 무단수집거부 | 사업자정보확인
경기도 안양시 동안구 호계동 1065-10 협성골드프라자 601호 한컴에듀케이션(주) TEL : 031-388-8840 FAX : 031-388-0996
대표자 : 김동규 사업자번호 : 130-86-02870 통신판매업신고번호 : 제 2010-경기안양-888호
COPYTIGHT(C) 한컴에듀케이션(주), ALL RIGHT RESERVED.
담은강좌 : 0