diff --git a/go/build-a-matrix-with-conditions.go b/go/build-a-matrix-with-conditions.go new file mode 100644 index 0000000..7101abe --- /dev/null +++ b/go/build-a-matrix-with-conditions.go @@ -0,0 +1,68 @@ +package main + +import aq "github.com/emirpasic/gods/v2/queues/arrayqueue" + +func buildMatrix(k int, rowConditions [][]int, colConditions [][]int) [][]int { + toposort := func(edges [][]int, n int) []int { + neighbours := make([][]int, n+1) + for i := range n + 1 { + neighbours[i] = []int{} + } + + degrees, order := make([]int, n+1), make([]int, n) + for _, edge := range edges { + u, v := edge[0], edge[1] + + neighbours[u] = append(neighbours[u], v) + degrees[v]++ + } + + queue := aq.New[int]() + for i := 1; i <= n; i++ { + if degrees[i] == 0 { + queue.Enqueue(i) + } + } + + idx := 0 + for !queue.Empty() { + u, _ := queue.Dequeue() + order[idx] = u + + n-- + for _, v := range neighbours[u] { + degrees[v]-- + if degrees[v] == 0 { + queue.Enqueue(v) + } + } + + idx++ + } + + if n != 0 { + return []int{} + } + return order + } + + rowOrder, colOrder := toposort(rowConditions, k), toposort(colConditions, k) + if len(rowOrder) == 0 || len(colOrder) == 0 { + return [][]int{} + } + + matrix := make([][]int, k) + for i := range k { + matrix[i] = make([]int, k) + } + + for row := range k { + for col := range k { + if rowOrder[row] == colOrder[col] { + matrix[row][col] = rowOrder[row] + } + } + } + + return matrix +}