1. 문제요약

- 친구의 수 찾기

- 최대 친구를 가진 친구의 수를 출력

- 친구는 직접적으로 아는 친구 A-B

- 친구의 친구 A-B-C

  (영문은 B가 A, C와 친구라면 A는 C와 친구)

  ("2-friend" 라고 나옴)

- vector<string> frineds 가 주어짐 

  친구이면 'Y', 친구가 아니면 'N'


2. 접근방법


3. 시간복잡도


4. 회고

- 일단 친구의 친구의 의미를 잘못 이해함

  A-B-C-D에서 

  A-B-C 이면 A는 C와 친구

  A-C-D 이므로 C는 A와 D 모두 친구이므로 A-D도 친구 인줄 알았음


- 이게 아니라 A-B-C-D 이면 그냥 A는 B, C랑만 친구임


- 플로이드 워셜

  단순히 모든 정점을 방문한다고 생각해서 friends[i][k] == 'Y' && frineds[k][j] == 'Y' 라고 하면

  플로이드에서 0 -(N)-> 0 -(Y)-> 1 인 경우 친구가 아니라고 판단하게 됨


  또한, 0 -(Y)-> 1 -(Y)-> 0 인경우는 friends[0][0] 을 친구로 만들어 버림


  friends 를 업데이트 하게 되면 A-B-C-D 에서 A-D가 친구로 판단 하기 때문에 다른 친구관계를 저장할 다른 배열이 필요함


- 3가지 경우로 나눠야 함

  ⅰ) A -(N)-> A -(Y)-> B 인 경우      

i == k && friends[k][j] == 'Y'

  ⅱ) A -(Y)-> B -(N)-> B 인 경우      

k == j && friends[i][k] == 'Y'

  ⅲ) 일반적인 경우 A -(Y)-> B -(Y)-> C      

friends[i][k] == 'Y' && friends[k][j] == 'Y'

  ※ 나머지 

     0 -(Y)-> 1 -(Y)-> 0 으로 돌아오는 경우는 새로 만들어 주는 배열에서 친구관계를 셀때 빼면됨


  플로이드는 경로가 출발, 도착 보다 뒤에 바뀌기 때문에 책처럼 풀 수 없음

  0 -> 1 -> 2 다음엔 0 -> 1 -> 3 ... 1 -> 1 -> 3 이런 순이기 때문에 한 정점에서 시작하는 모든 친구를 셀 수 없음


- dfs 는 

           1

     0 <  |

           2 - 3

  인 경우에 0 - 1 - 2 순으로 방문하면 정점 2는 방문 했기 때문에 더이상 방문을 하지 못함

  하지만 최단거리(친구 2단계) 에서는 0 - 2 - 3 으로 0과 3이 친구가 될 수 있음


- bfs 는 깊이(친구 2단계)를 지정해주면 풀 수있음


소스코드 : 플로이드



소스코드 : bfs


+ Recent posts