logo

서로 다른 정점 색상을 갖는 삼각형의 최대 면적

행렬이 주어지면 N 행과 열은 세 개의 값 {r g b}으로 구성됩니다. 과제는 한쪽 변이 y축과 평행한, 즉 수직이고 세 꼭지점의 색상이 모두 다른 가장 큰 삼각형의 면적을 찾는 것입니다.
예:  
 

    Input :     N = 4 M =5  
mat[][] =
{
r r r r r
r r r r g
r r r r r
b b b b b
}
Output : 10
The maximum area of triangle is 10.
Triangle coordinates are (00) containing r (14) containing g (30) containing b.

서로 다른 정점 색상을 갖는 삼각형의 최대 면적

 

우리는 삼각형의 면적 = 1/2 * 밑변 * 높이를 알고 있으므로 삼각형의 밑변과 높이를 최대화해야 합니다. 한 변은 y축과 평행하므로 그 변을 삼각형의 밑변으로 간주할 수 있습니다.
기준을 최대화하기 위해 각 열에 대해 {r g b}의 첫 번째 및 마지막 발생을 찾을 수 있습니다. 따라서 각 열에 대해 3개의 값으로 구성된 두 세트가 있습니다. 모든 열의 기본에 대해 하나의 꼭지점은 첫 번째 세트에서 나오고 두 번째 꼭지점은 두 번째 세트에서 나오므로 서로 다른 값을 갖습니다.
기본 기둥의 높이를 최대화하려면 꼭지점이 다른 두 꼭지점과 다른 값을 갖는 기둥의 왼쪽 또는 오른쪽 기둥에서 가장 멀리 떨어져 있어야 하는 세 번째 꼭지점을 선택해야 합니다. 
이제 각 열에 대해 삼각형의 최대 면적을 찾으십시오.
다음은 이 접근 방식의 구현입니다.
 



C++
// C++ program to find maximum area of triangle // having different vertex color in a matrix. #include   using namespace std; #define R 4 #define C 5 // return the color value so that their corresponding // index can be access. int mapcolor(char c) {  if (c == 'r')  return 0;  else if (c == 'g')  return 1;  else if (c == 'b')  return 2; } // Returns the maximum area of triangle from all // the possible triangles double findarea(char mat[R][C] int r int c  int top[3][C] int bottom[3][C]  int left[3] int right[3]) {  double ans = (double)1;  // for each column  for (int i = 0; i < c; i++)  // for each top vertex  for (int x = 0; x < 3; x++)  // for each bottom vertex  for (int y = 0; y < 3; y++)  {  // finding the third color of  // vertex either on right or left.  int z = 3 - x - y;  // finding area of triangle on left side of column.  if (x != y && top[x][i] != INT_MAX &&  bottom[y][i] != INT_MIN && left[z] != INT_MAX)  {  ans = max(ans ((double)1/(double)2) *  (bottom[y][i] - top[x][i]) *  (i - left[z]));  }  // finding area of triangle on right side of column.  if (x != y && top[x][i] != INT_MAX &&  bottom[y][i] != INT_MIN &&  right[z] != INT_MIN)  {  ans = max(ans ((double)1/(double)2) *  (bottom[y][i] - top[x][i]) *  (right[z] - i));  }  }  return ans; } // Precompute the vertices of top bottom left // and right and then computing the maximum area. double maxarea(char mat[R][C] int r int c) {  int left[3] right[3];  int top[3][C] bottom[3][C];  memset(left INT_MAX sizeof left);  memset(right INT_MIN sizeof right);  memset(top INT_MAX sizeof top);  memset(bottom INT_MIN sizeof bottom);  // finding the r b g cells for the left  // and right vertices.  for (int i = 0; i < r; i++)  {  for (int j = 0; j < c; j++)  {  left[mapcolor(mat[i][j])] =  min(left[mapcolor(mat[i][j])] j);  right[mapcolor(mat[i][j])] =  max(left[mapcolor(mat[i][j])] j);  }  }  // finding set of {r g b} of top and  // bottom for each column.  for (int j = 0; j < c; j++)  {  for( int i = 0; i < r; i++)  {  top[mapcolor(mat[i][j])][j] =  min(top[mapcolor(mat[i][j])][j] i);  bottom[mapcolor(mat[i][j])][j] =  max(bottom[mapcolor(mat[i][j])][j] i);  }  }  return findarea(mat R C top bottom left right); } // Driven Program int main() {  char mat[R][C] =  {  'r' 'r' 'r' 'r' 'r'  'r' 'r' 'r' 'r' 'g'  'r' 'r' 'r' 'r' 'r'  'b' 'b' 'b' 'b' 'b'  };  cout << maxarea(mat R C) << endl;  return 0; } 
Java
import java.util.Arrays; public class Main {  static int R = 4;  static int C = 5;  static char[][] mat = {  {'r' 'r' 'r' 'r' 'r'}  {'r' 'r' 'r' 'r' 'g'}  {'r' 'r' 'r' 'r' 'r'}  {'b' 'b' 'b' 'b' 'b'}  };  public static void main(String[] args) {  System.out.println(maxArea(mat R C));  }  // Returns the color value so that their corresponding index can be accessed.  static int mapColor(char c) {  if (c == 'r') return 0;  else if (c == 'g') return 1;  else if (c == 'b') return 2;  else return -1;  }  // Returns the maximum area of triangle from all the possible triangles  static double findArea(char[][] mat int r int c int[][] top int[][] bottom int[] left int[] right) {  double ans = 10;  // For each column  for (int i = 0; i < c; i++) {  // For each top vertex  for (int x = 0; x < 3; x++) {  // For each bottom vertex  for (int y = 0; y < 3; y++) {  // Finding the third color of vertex either on right or left.  int z = 3 - x - y;  // Finding area of triangle on left side of column.  if (x != y && top[x][i] != Integer.MAX_VALUE &&  bottom[y][i] != Integer.MIN_VALUE &&  left[z] != Integer.MAX_VALUE) {  ans = Math.max(ans 0.5 *  (bottom[y][i] - top[x][i]) * (i - left[z]));  }  // Finding area of triangle on right side of column.  if (x != y && top[x][i] != Integer.MAX_VALUE &&  bottom[y][i] != Integer.MIN_VALUE &&  right[z] != Integer.MIN_VALUE) {  ans = Math.max(ans 0.5 *  (bottom[y][i] - top[x][i]) * (right[z] - i));  }  }  }  }  return ans;  }  // Precompute the vertices of top bottom left and right and then computing the maximum area.  static double maxArea(char[][] mat int r int c) {  int[] left = new int[3];  Arrays.fill(left Integer.MAX_VALUE);  int[] right = new int[3];  Arrays.fill(right Integer.MIN_VALUE);  int[][] top = new int[3][c];  for (int[] row : top) Arrays.fill(row Integer.MAX_VALUE);  int[][] bottom = new int[3][c];  for (int[] row : bottom) Arrays.fill(row Integer.MIN_VALUE);  // Finding the r b g cells for the left and right vertices.  for (int i = 0; i < r; i++) {  for (int j = 0; j < c; j++) {  int color = mapColor(mat[i][j]);  left[color] = Math.min(left[color] j);  right[color] = Math.max(right[color] j);  }  }  // Finding set of {r g b} of top and bottom for each column.  for (int j = 0; j < c; j++) {  for (int i = 0; i < r; i++) {  int color = mapColor(mat[i][j]);  top[color][j] = Math.min(top[color][j] i);  bottom[color][j] = Math.max(bottom[color][j] i);  }  }  return findArea(mat r c top bottom left right);  } } 
Python3
# Python3 program to find the maximum  # area of triangle having different  # vertex color in a matrix.  # Return the color value so that their  # corresponding index can be access.  def mapcolor(c): if c == 'r': return 0 elif c == 'g': return 1 elif c == 'b': return 2 # Returns the maximum area of triangle  # from all the possible triangles  def findarea(mat r c top bottom left right): ans = 1 # for each column  for i in range(0 c): # for each top vertex  for x in range(0 3): # for each bottom vertex  for y in range(0 3): # finding the third color of  # vertex either on right or left.  z = 3 - x - y # finding area of triangle on  # left side of column.  if (x != y and top[x][i] != INT_MAX and bottom[y][i] != INT_MIN and left[z] != INT_MAX): ans = max(ans 0.5 * (bottom[y][i] - top[x][i]) * (i - left[z])) # finding area of triangle on right side of column.  if (x != y and top[x][i] != INT_MAX and bottom[y][i] != INT_MIN and right[z] != INT_MIN): ans = max(ans 0.5 * (bottom[y][i] - top[x][i]) * (right[z] - i)) return ans # Precompute the vertices of top bottom left  # and right and then computing the maximum area.  def maxarea(mat r c): left = [-1] * 3 right = [0] * 3 top = [[-1 for i in range(C)] for j in range(3)] bottom = [[0 for i in range(C)] for j in range(3)] # finding the r b g cells for  # the left and right vertices.  for i in range(0 r): for j in range(0 c): left[mapcolor(mat[i][j])] =  min(left[mapcolor(mat[i][j])] j) right[mapcolor(mat[i][j])] =  max(left[mapcolor(mat[i][j])] j) # finding set of r g b of top  # and bottom for each column.  for j in range(0 c): for i in range(0 r): top[mapcolor(mat[i][j])][j] =  min(top[mapcolor(mat[i][j])][j] i) bottom[mapcolor(mat[i][j])][j] =  max(bottom[mapcolor(mat[i][j])][j] i) return int(findarea(mat R C top bottom left right)) # Driver Code if __name__ == '__main__': R C = 4 5 mat = [['r' 'r' 'r' 'r' 'r'] ['r' 'r' 'r' 'r' 'g'] ['r' 'r' 'r' 'r' 'r'] ['b' 'b' 'b' 'b' 'b']] INT_MAX INT_MIN = float('inf') float('-inf') print(maxarea(mat R C)) # This code is contributed by Rituraj Jain 
C#
// C# program to find maximum area of triangle // having different vertex color in a matrix. using System; class MainClass {  const int R = 4;  const int C = 5;  // return the color value so that their corresponding  // index can be access.  static int mapcolor(char c)  {  if (c == 'r') {  return 0;  }  else if (c == 'g') {  return 1;  }  else if (c == 'b') {  return 2;  }  else {  return -1;  }  }  // Returns the maximum area of triangle from all  // the possible triangles  static double findarea(char[ ] mat int r int c  int[ ] top int[ ] bottom  int[] left int[] right)  {  double ans = .0;  // for each column  for (int i = 0; i < c; i++) {  // for each top vertex  for (int x = 0; x < 3; x++) {  // for each bottom vertex  for (int y = 0; y < 3; y++) {  // finding the third color of  // vertex either on right or left.  int z = 3 - x - y;  // finding area of triangle on left side  // of column.  if (x != y  && top[x i]  != int.MaxValue&&  bottom[y i]  != int.MinValue&& left[z]  != int.MaxValue) {  ans = Math.Max(  ans  (1.0 / 2.0)  * (bottom[y i] - top[x i])  * (i - left[z]));  }  // finding area of triangle on right  // side of column.  if (x != y  && top[x i]  != int.MaxValue&&  bottom[y i]  != int.MinValue&& right[z]  != int.MinValue) {  ans = Math.Max(  ans  (1.0 / 2.0)  * (bottom[y i] - top[x i])  * (right[z] - i)+4);  }  }  }  }  return ans;  }  // Precompute the vertices of top bottom left  // and right and then computing the maximum area.  static double maxarea(char[ ] mat int r int c)  {  int[] left  = { int.MaxValue int.MaxValue int.MaxValue };  int[] right  = { int.MinValue int.MinValue int.MinValue };  int[ ] top = new int[3 C];  int[ ] bottom = new int[3 C];  // finding the r b g cells for the left  // and right vertices.  for (int i = 0; i < r; i++) {  for (int j = 0; j < c; j++) {  int color = mapcolor(mat[i j]);  if (color != -1) {  left[color] = Math.Min(left[color] j);  right[color]  = Math.Max(right[color] j);  }  }  }  // finding set of {r g b} of top and  // bottom for each column.  for (int j = 0; j < c; j++) {  for (int i = 0; i < r; i++) {  int color = mapcolor(mat[i j]);  if (color != -1) {  top[color j]  = Math.Min(top[color j] i);  bottom[color j]  = Math.Max(bottom[color j] i);  }  }  }  return findarea(mat R C top bottom left  right);  }  // Driven Program  public static void Main(string[] args)  {  char[ ] mat = new char[ ] {  { 'r' 'r' 'r' 'r' 'r' }  { 'r' 'r' 'r' 'r' 'g' }  { 'r' 'r' 'r' 'r' 'r' }  { 'b' 'b' 'b' 'b' 'b' }  };  Console.WriteLine(maxarea(mat R C));  } } 
JavaScript
// Javascript program to find maximum area of triangle // having different vertex color in a matrix. // return the color value so that their corresponding // index can be accessed. function mapcolor(c) {  if (c == 'r') return 0;  else if (c == 'g') return 1;  else if (c == 'b') return 2; } // Returns the maximum area of triangle from all // the possible triangles function findarea(mat r c top bottom left right) {  let ans = 10;  // for each column  for (let i = 0; i < c; i++) {  // for each top vertex  for (let x = 0; x < 3; x++) {  // for each bottom vertex  for (let y = 0; y < 3; y++) {  // finding the third color of  // vertex either on right or left.  let z = 3 - x - y;  // finding area of triangle on left side of column.  if (x != y && top[x][i] != Number.MAX_SAFE_INTEGER &&  bottom[y][i] != Number.MIN_SAFE_INTEGER &&  left[z] != Number.MAX_SAFE_INTEGER) {  ans = Math.max(ans (1/2) *  (bottom[y][i] - top[x][i]) * (i - left[z]));  }  // finding area of triangle on right side of column.  if (x != y && top[x][i] != Number.MAX_SAFE_INTEGER &&  bottom[y][i] != Number.MIN_SAFE_INTEGER &&  right[z] != Number.MIN_SAFE_INTEGER) {  ans = Math.max(ans (1/2) *  (bottom[y][i] - top[x][i]) * (right[z] - i));  }  }  }  }  return ans; } // Precompute the vertices of top bottom left // and right and then computing the maximum area. function maxarea(mat r c) {  let left = [Number.MAX_SAFE_INTEGER Number.MAX_SAFE_INTEGER Number.MAX_SAFE_INTEGER];  let right = [Number.MIN_SAFE_INTEGER Number.MIN_SAFE_INTEGER Number.MIN_SAFE_INTEGER];  let top = Array.from({length: 3} () => Array(c).fill(Number.MAX_SAFE_INTEGER));  let bottom = Array.from({length: 3} () => Array(c).fill(Number.MIN_SAFE_INTEGER));  // finding the r b g cells for the left  // and right vertices.  for (let i = 0; i < r; i++) {  for (let j = 0; j < c; j++) {  let color = mapcolor(mat[i][j]);  left[color] = Math.min(left[color] j);  right[color] = Math.max(right[color] j);  }  }  // finding set of {r g b} of top and  // bottom for each column.  for (let j = 0; j < c; j++) {  for (let i = 0; i < r; i++) {  let color = mapcolor(mat[i][j]);  top[color][j] = Math.min(top[color][j] i);  bottom[color][j] = Math.max(bottom[color][j] i);  }  }  return findarea(mat r c top bottom left right); } // Driven Program const R = 4; const C = 5; const mat = [  ['r' 'r' 'r' 'r' 'r']  ['r' 'r' 'r' 'r' 'g']  ['r' 'r' 'r' 'r' 'r']  ['b' 'b' 'b' 'b' 'b'] ]; console.log(maxarea(mat R C)); // akashish__ 

산출:  

10


시간 복잡도: 오(R*C)
보조 공간: O(R + C) 
원천: https://stackoverflow.com/questions/40078660/maximum-area-of-triangle-having-all-vertices-of- Different-color
 

퀴즈 만들기