---
# System prepended metadata

title: Sprint 4 Module Project 2

---

# Sprint 4 Module Project 2
## CS Friend Circles
```
"""
Understand

The examples given are good enough.

Plan
1. Translate the problem into graph terminology
- This is a typical adjacency matrix graph representation
- student = node
- matrix[i][j] = True if student i is friends with student j (edge)

2. Build your graph
- The graph is already built. It's an adjacency matrix

3. Traverse the graph
- For each student traverse their social circle
- Make sure to mark students previously visited so that you don't revisit the same social circle
- Count the number of social circles visited
- Any traversal will work

Runtime: O(number of nodes) we'll only visit each node/student once
Space: O(number of nodes) the size of our stack will not exceed the number of nodes
since we mark them as visited when we push onto the stack
"""

from collections import deque

def csFriendCircles(friendships):
    numSocialCircle = 0
    visited = set()
    for student in range(len(friendships)):
        if not student in visited:
            numSocialCircle += 1
            traverseSocialCircle(friendships, student, visited)
    return numSocialCircle

def traverseSocialCircle(graph, startingNode, visited):
    stack = deque()
    stack.append(startingNode)
    visited.add(startingNode)
    while len(stack) > 0:
        curr = stack.pop()
        for (node, edge) in enumerate(graph[curr]):
            if edge == 1 and not node in visited:
                visited.add(node)
                stack.append(node)

```