Largest product in a grid
Problem 11
In the 2020 grid below, four numbers along a diagonal line have been marked in red.
What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 2020 grid?
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
The product of these numbers is 26 63 78 14 = 1788696.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
What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 2020 grid?
문제 11번 : 아래 주어진 2020 격자에서 대각선으로 놓인 숫자 4개가 빨간색으로 표시되어 있다. 그 숫자들의 곱은 26 63 78 14 = 1788696 이다. 그러면 같은 방향(위, 아래, 왼쪽, 오른쪽, 또는 대각선)으로 붙어있는 숫자 4개의 가장 큰 곱은 얼마인가?
먼저 당면한 과제는 위에 주어진 숫자들을 어떻게 받아올 것인지 하는 부분입니다. 결국은 무식하게 숫자 사이사이에 , 를 넣고 2차원 배열을 이용해서 받았는데... 별로 권장하고 싶은 방법은 아니더군요. 계속 주어진 숫자를 이용하는 문제들이 나오는데 좋은 방법을 찾아봐야 할 것 같습니다.
아무튼 숫자들을 배열에 넣고 나면 사실, 코드 자체는 어려울 것이 없습니다. 같지만 다른 방향으로 4번만 반복하면 되기 때문이지요. 수평방향, 수직방향, 그리고 대각선 두 방향을 각각 생각해 주시면 됩니다. For문을 통해서 계산을 할 것이기 때문에 어떤 경우에 index가 1부터 20까지 가야 할 수도 있고 어떤 경우에는 1부터 17까지만 가야 할 수도 있습니다. 18을 넘어가면 숫자가 3개만 남는 경우가 생기기 때문이지요.
int result = 0; // vertical for(int i = 0; i < 20; i++) { for(int j = 0; j < 17; j++) { int temp = num[j][i]; for(int k = 1; k < 4; k++) { temp = temp*num[j+k][i]; if(temp == 0) { j += k; break; } } if(temp > result) result = temp; } }
제가 짠 수직방향 코드만 첨부합니다. 다른 방향은 index만 살짝 고쳐주면 되기 때문에 별로 어려운 부분은 아닌 것 같네요. 중간에 값이 0인 경우는 빠른 계산을 위해서 건너뛰게끔 했는데, 이 부분은 대각선 파트에선 지워버렸습니다. 대각선에서는 숫자를 대각선으로 카운팅해야 건너뛰는게 성립되는데 영 복잡해져서 약간의 시간을 감수하고 없애버렸네요.
결과는 바로 잘 나왔습니다. 시간도 거의 걸리지 않네요. 그래봐야 겨우 400개짜리 숫자들이었으니... 다만 격자가 커진다면 결과가 많이 달라지겠지요. 코드가 거진 \(O(n^2)\) 정도이기 때문에 숫자가 크면 꽤나 불리한 코드입니다.
댓글 없음:
댓글 쓰기