프로젝트 오일러 11

Reference 
http://forum.falinux.com/zbxe/index.php?document_srl=408129&mid=C_LIB
http://forum.falinux.com/zbxe/?document_srl=408126&mid=C_LIB&sort_index=readed_count&order_type=desc

프로젝트 오일러 11


아래와 같은 20×20 격자가 있습니다.
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
위에서 대각선 방향으로 연속된 붉은 숫자 네 개의 곱은 26 × 63 × 78 × 14 = 1788696 입니다.
그러면 수평, 수직, 또는 대각선 방향으로 연속된 숫자 네 개의 곱 중 최대값은 얼마입니까?
---------------------------------------------------------------------------------
#include
#include
#include

void main(void){
int numberMatrix[20][20];
char num[] = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48";
int i, j, temp, max=0;


numberMatrix[0][0] = atoi(strtok(num," "));

for(i=0;i<20 font="" i="">
for(j=0;j<20 font="" j="">
if(i==0&&j==0){continue;}
numberMatrix[i][j]=atoi(strtok(NULL," "));
}
}

for(i=0;i<17 font="" i="">
for(j=0;j<20 font="" j="">
temp = numberMatrix[i][j]*numberMatrix[i+1][j]*numberMatrix[i+2][j]*numberMatrix[i+3][j];
if(max
}
}

for(i=0;i<20 font="" i="">
for(j=0;j<17 font="" j="">
temp = numberMatrix[i][j]*numberMatrix[i][j+1]*numberMatrix[i][j+2]*numberMatrix[i][j+3];
if(max
}
}

for(i=0;i<17 font="" i="">
for(j=0;j<17 font="" j="">
temp = numberMatrix[i][j]*numberMatrix[i+1][j+1]*numberMatrix[i+2][j+2]*numberMatrix[i+3][j+3];
if(max
}
}

for(i=0;i<17 font="" i="">
for(j=3;j<20 font="" j="">
temp = numberMatrix[i][j]*numberMatrix[i+1][j-1]*numberMatrix[i+2][j-2]*numberMatrix[i+3][j-3];
if(max
}
}

printf("%d\n",max);
}
----------------------------------------------------------------------------------------
저 많은 숫자들을 문자열로 취급하는 건 생각했지만 string 과 stdlib 헤더를 사용해 써야하는 법은 잘 모르겠다. 특히 atoi 와 strtok은 처음 봤다.

atoi()

10진 정수 문자열을 정수로 변환합니다.
  1. 문자열에서 10진 정수 숫자 문자 뒤의 일반 문자는 취소되며, 10진 정수 숫자 문자까지만 숫자로 변환됩니다.
  2. 10진 정수 숫자 문자 앞의 공백문자는 자동 제거되어 10진 정수 숫자 문자까지만 숫자로 변환됩니다.
  3. 공백 및 10진 정수 문자가 아닌 문자로 시작하면 0을 반환합니다.
헤더stdlib.h
형태int atoi(const char *str);
인수
char *str정수로 변환할 10진수 정수 문자열
반환
int10진 정수 값
예제
#include 
#include 

int main( void)
{
   printf( "%s = %d\n", "2007"                  , atoi( "2007"                  ));
   printf( "%s = %d\n", "2007forum falinux com" , atoi( "2007forum falinux com" ));
   printf( "%s = %d\n", "forum falinux com 2007", atoi( "forum falinux com 2007"));
   printf( "%s = %d\n", "  2007"                , atoi( "  2007"                ));
   printf( "%s = %d\n", ".,2007"                , atoi( ".,2007"                ));
   printf( "%s = %d\n", "#$2007"                , atoi( "#$2007"                ));

   return 0;
}
]$ ./a.out
2007 = 2007
2007forum falinux com = 2007
forum falinux com 2007 = 0
  2007 = 2007
.,2007 = 0
#$2007 = 0

strtok()


문자열을 문자로 자르는 함수 입니다. 예로, "forum.falinux.com"을 "."으로 자르기를 하면, 함수를 호출할 때 마다 "forum", "falinux", "com"의 선두 번지의 포인터를 반환합니다.
처음에는 자르기 대상인 문자열과 자르기를 위한 문자를 인수로 호출합니다.
strtok( str, sep);
이후에는 문자열 대상을 NULL과 자르기를 위한 문자만 인수로 전달합니다.
strtok( NULL, sep);
더 이상 구할 문자열이 없다면 NULL이 반환됩니다.
*** 주의 ***
strtok()는 잘라 낸 문자열을 구하기 위해 대상 문자열에 NULL을 추가합니다. 즉, 원래의 문자열 내용이 변경 되므로 주의해야 합니다.
헤더string.h
형태char *strtok(char *restrict s1, const char *restrict s2);
인수
char *s1자르기 대상 문자열
char *s2잘라 내기 위한 문자 모임
반환
char *잘라 내기한 문자열의 첫번째 포인터를 반환하며, 문자열이 없다면 NULL을 반환
예제
#include 
#include 

int main( void)
{           
   char   str[] = "forum falinux com";
   char	*ptr;
   int	 ndx;

   printf( "함수 호출 전: %s\n", str); 

   ptr = strtok( str, " ");
   printf( "%s\n", ptr); 
   
   while( ptr = strtok( NULL, " "))
   {
	   printf( "%s\n", ptr); 
   }
   
   printf( "함수 호출 후: %s\n", str); 

   // 함수 호출 후에는 원본 문자열의 내용이 바뀌므로 주의해야 합니다.
        
   printf( "문자열의 변화\n", str); 
  
   for( ndx=0; ndx < 17; ndx++)
	   printf( "%c %d\n", str[ndx], str[ndx]); 
	   
   return 0;
}
]$ ./a.out
함수 호출 전: forum falinux com
forum
falinux
com
함수 호출 후: forum
문자열의 변화
f 102
o 111
r 114
u 117
m 109
 0
f 102
a 97
l 108
i 105
n 110
u 117
x 120
 0
c 99
o 111
m 109

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리