숫자 1부터 시작해서 우측으로부터 시계방향으로 감아 5×5 행렬을 만들면 아래와 같이 됩니다.
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13여기서 대각선상의 숫자를 모두 더한 값은 101 입니다.
같은 방식으로 1001×1001 행렬을 만들었을 때, 대각선상의 숫자를 더하면 얼마가 됩니까?
두 가지 방법이 있겠다.
똑똑하게 계산해서 푸는 방법과 우직하게 달팽이 배열 만들어서 더하는 방법.
둘 모두 사용해봤다. 당연히 짧은 쪽이 현명한 방법이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/env perl use 5.010; use strict; use warnings; my $r = 1; for my $i (1..500) { for my $j (0..3) { $r+=((2*$i+1)**2-2*$i*$j); } } say $r; |
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
31
32
33
|
#!/usr/bin/env perl use 5.010; use strict; use warnings; my @a; my $x = 500; my $y = 500; my $p = 0; my $c = 1; my $r = 0; while (true) { $a[$x][$y] = $c++; last if ($x == 1000 and $y == 0); if ($p % 4 == 0) { $x++; $p++ if ($a[$x][$y+1] == undef); } elsif ($p % 4 == 1) { $y++; $p++ if ($a[$x-1][$y] == undef); } elsif ($p % 4 == 2) { $x--; $p++ if ($a[$x][$y-1] == undef); } elsif ($p % 4 == 3) { $y--; $p++ if ($a[$x+1][$y] == undef); } } foreach (0..1000) { $r += $a[$_][$_] + $a[$_][1000-$_]; } print $r - 1; |