| [ QuizWit ] in KIDS 글 쓴 이(By): parsec ( 먼 소 류 ) 날 짜 (Date): 2002년 5월 29일 수요일 오후 05시 58분 57초 제 목(Title): Re: 간단한(?) 조합문제 짝수개인 경우엔 cdpark님이 옛날에 풀어놓으셨군요. 마치 아라비아인의 낙타 문제처럼 하나를 왕따시킨 다음, 나머지가 돌아가며 중매를 맡아 짝을 지어주고 중매쟁이와 왕따가 짝짓는 방식이네요. 홀수개인 때엔 왕따가 필요없네요. 여튼 앞에서 제가 푼 방식은 다음과 같이 C코드로 만들 수 있습니다. void calcmatch(int **tbl, int n) { int i, j, k, max, test; for(i=0; i<n; i++) for(j=0;j<n;j++) { tbl[i][j] = 0; } for(i=0; i<n; i++) for(j=i+1; j<n; j++) { max=0; for(k=0; k<i; k++) if(tbl[k][j]>=max) max=tbl[k][j]+1; for(k=0; k<j; k++) if(tbl[i][k]>=max) max=tbl[i][k]+1; max %= (n+1)/2*2; if(max==0) max++; do { test=0; for(k=0; k<i; k++) if(tbl[k][j]==max) test=1; for(k=0; k<j; k++) if(tbl[i][k]==max) test=1; if(test==1) max++; } while (test==1); tbl[i][j] = max; tbl[j][i] = max; } } void printtbl(int **tbl, int n) { int i,j,k; printf(" "); for(i=0; i<n; i++) printf("%c ",'A'+i); printf("\n"); for(i=0; i<n; i++) { printf("%c ",'A'+i); for(j=0;j<n;j++) { if(tbl[i][j]==0)printf("X"); else printf("%d",tbl[i][j]); if(j==n-1) printf("\n"); else printf(" "); } } printf("\n"); } void printmatch(int **tbl, int n) { int i,j,k; for(k=1; k<=(n-1)/2*2+1; k++) { printf("Day %3d: ", k); for(i=0; i<n; i++) for(j=i+1; j<n; j++) { if(tbl[i][j]==k) printf("%c-%c ",'A'+i,'A'+j); } if(i==n) printf("\n"); } } ◇ ~~~_ _ ∴ ~|~| | _/__, SEP. 11. 2001 _ ∴∴ _ ~ | | \ ` Armorica under a tat ,-| `,-,_| |__ | | | A ______|_|__|_|___|__|| | |__|_|_____________________________________ |