-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3DProjectionArea.go
116 lines (82 loc) · 2.49 KB
/
3DProjectionArea.go
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
On a N * N grid, we place some 1 * 1 * 1 cubes that are axis-aligned with the x, y, and z axes.
Each value v = grid[i][j] represents a tower of v cubes placed on top of grid cell (i, j).
Now we view the projection of these cubes onto the xy, yz, and zx planes.
A projection is like a shadow, that maps our 3 dimensional figure to a 2 dimensional plane.
Here, we are viewing the "shadow" when looking at the cubes from the top, the front, and the side.
Return the total area of all three projections.
Example 1:
Input: [[2]]
Output: 5
Example 2:
Input: [[1,2],[3,4]]
Output: 17
Explanation:
Here are the three projections ("shadows") of the shape made with each axis-aligned plane.
https://s3-lc-upload.s3.amazonaws.com/uploads/2018/08/02/shadow.png
Example 3:
Input: [[1,0],[0,2]]
Output: 8
Example 4:
Input: [[1,1,1],[1,0,1],[1,1,1]]
Output: 14
Example 5:
Input: [[2,2,2],[2,1,2],[2,2,2]]
Output: 21
Note:
1 <= grid.length = grid[0].length <= 50
0 <= grid[i][j] <= 50
*/
package main
import (
"fmt"
)
func main() {
tests := [][][]int{{{2}}, {{1, 2}, {3, 4}}, {{1, 0}, {0, 2}}, {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}}, {{2, 2, 2}, {2, 1, 2}, {2, 2, 2}}}
for _, test := range tests {
fmt.Println(projectionArea(test))
}
}
func projectionArea(grid [][]int) int {
// total projection are in all three planes
totalProjectionArea := 0
// list of tallest columns when viewd from North/South (XY) side
xyAreas := []int{}
areaZXDebug := 0
areaYZDebug := 0
// calculate West/East (yz) projection area
for i := 0; i < len(grid); i++ {
// tallest found in grid[i] - West/East
areaYZ := 0
for j := 0; j < len(grid[i]); j++ {
if grid[i][j] > areaYZ {
areaYZ = grid[i][j]
}
if grid[i][j] > 0 {
// add to Up/Down projection area (each nonzero cube column would form an up/won projection area of one unit)
totalProjectionArea += 1
areaZXDebug += 1
}
// update north/south areas list
if len(xyAreas) < (i + 1) {
xyAreas = append(xyAreas, grid[i][j])
} else if xyAreas[i] < grid[i][j] {
xyAreas[i] = grid[i][j]
}
}
// add West/East (YZ) area component to total
areaYZDebug += areaYZ
totalProjectionArea += areaYZ
}
// add north/south are to total
areaXYDebug := 0
for _, xyAreaVal := range xyAreas {
totalProjectionArea += xyAreaVal
areaXYDebug += xyAreaVal
}
fmt.Printf("Input: %v\n", grid)
fmt.Printf("\tAreaYZ: %d\n", areaYZDebug)
fmt.Printf("\tAreaXY: %d\n", areaXYDebug)
fmt.Printf("\tAreaZX: %d\n", areaZXDebug)
return totalProjectionArea
}