안정된+집단

어떤 집단이 다음의 세 조건을 만족하면 그 집단은 안정된 집단이라고 한다.

1. 같은 그룹에 속한 사람들끼리는 서로 좋아해야 한다.

2. 다른 그룹에 속한 사람들끼리는 서로 싫어해야 한다.

3. 한 그룹은 최소한 2명 이상이다.

한 집단의 사람들 사이에 좋아하고 싫어하는 관계가 주어졌을 때, 그 집단이 안정된 집단인지 검사하는 프로그램을 작성하시오. 안정된 집단이라면, 그 집단을 이루고 있는 그룹과 그 그룹에 속한 사람들을 출력하시오.

대인관계에는 대칭성이 있어서 A가 B를 좋아하면 B도 A를 좋아한다고 한다. 사람들은 자기 자신을 무조건 좋아한다고 하자.

입력
첫째 줄에는 사람의 수 N이 주어진다. i+1번째 줄부터는 i번째 사람과 다른 사람과의 관계가 주어진다. 0 은 좋아함, 1은 싫어함을 나타낸다.

출력
안정된 집단이 아니라면 0만을 출력한다. 안정된 집단의 경우엔 그 집단을 이루는 그룹의 수를 첫줄에 출력하고, 둘째 줄부터는 각 그룹의 구성원을 출력한다. 그룹 내에서는 구성원의 번호순으로 출력하고, 그룹간에는 가장 빠른 번호의 구성원 순으로 출력한다.

입력 예
0 1 1 0 0

1 0 0 1 1

1 0 0 1 1

0 1 1 0 0

0 1 1 0 0

출력 예
2

1 4 5

2 3

Source Code code format="java5"

import java.util.Arrays; public class Group { public static void main(String[] args) { int[][] input = { {0, 1, 1, 0, 0},       {1, 0, 0, 1, 1},        {1, 0, 0, 1, 1},        {0, 1, 1, 0, 0},        {0, 1, 1, 0, 0}      };

int[][] pattern = new int[input.length / 2][];

int[] groupIndex = new int[input.length];

for(int i = 0; i < input.length; i++) { for(int j = 0; j < pattern.length; j++) { if(pattern[j] != null) { if(Arrays.equals(input[i], pattern[j])) { groupIndex[i] = j;         break; }       } else { pattern[j] = Arrays.copyOf(input[i], input[i].length); groupIndex[i] = j;        break; }      }      }

// 출력 for(int i = 0; i < pattern.length; i++) { for(int j = 0; j < groupIndex.length; j++) { if(groupIndex[j] == i) { System.out.print((j + 1) + " "); }      }       System.out.println; }    }    }

code

Comment