Find user who can access every camera
Company: Verkada
Role: Software Engineer
Category: Coding & Algorithms
Difficulty: medium
Interview Round: Onsite
Quick Answer: This question evaluates reasoning about access-control and transitive relationships, testing skills in graph modeling, reachability, and set operations within permission hierarchies.
Constraints
- 1 <= len(permissionsData) <= 20000
- At least one 'camera_owner' record exists.
- The group-membership graph is acyclic.
- Duplicate permission records may appear.
- Exactly one user can access all referenced cameras.
Examples
Input: [('user_1', 'camera_owner', 'camera_1'), ('user_1', 'group_member', 'group_1'), ('group_1', 'camera_owner', 'camera_2'), ('group_1', 'group_member', 'group_2'), ('group_2', 'camera_owner', 'camera_3'), ('user_2', 'group_member', 'group_1')]
Expected Output: 'user_1'
Explanation: user_1 has camera_1 directly, camera_2 through group_1, and camera_3 through group_1 -> group_2. user_2 only gets camera_2 and camera_3.
Input: [('user_9', 'camera_owner', 'camera_42')]
Expected Output: 'user_9'
Explanation: This is the single-record edge case. The only referenced camera is camera_42, and user_9 owns it directly.
Input: [('group_1', 'camera_owner', 'camera_1'), ('group_2', 'camera_owner', 'camera_2'), ('user_1', 'group_member', 'group_1'), ('user_1', 'group_member', 'group_2'), ('user_2', 'group_member', 'group_1'), ('user_3', 'group_member', 'group_2')]
Expected Output: 'user_1'
Explanation: user_1 combines access from two groups and reaches both cameras. user_2 and user_3 each reach only one.
Input: [('group_3', 'camera_owner', 'camera_4'), ('group_2', 'group_member', 'group_3'), ('group_1', 'group_member', 'group_2'), ('user_7', 'group_member', 'group_1'), ('user_7', 'camera_owner', 'camera_1'), ('group_1', 'camera_owner', 'camera_2'), ('group_2', 'camera_owner', 'camera_3'), ('user_8', 'group_member', 'group_2')]
Expected Output: 'user_7'
Explanation: user_7 gets camera_1 directly and inherits camera_2, camera_3, and camera_4 through group_1 -> group_2 -> group_3. user_8 only gets camera_3 and camera_4.
Input: [('group_1', 'camera_owner', 'camera_1'), ('group_1', 'camera_owner', 'camera_1'), ('group_2', 'camera_owner', 'camera_2'), ('group_1', 'group_member', 'group_2'), ('user_1', 'group_member', 'group_1'), ('user_1', 'group_member', 'group_1'), ('user_2', 'camera_owner', 'camera_1')]
Expected Output: 'user_1'
Explanation: Duplicate records should not change the result. user_1 gets camera_1 from group_1 and camera_2 through group_1 -> group_2, while user_2 only has camera_1.
Hints
- Think of each entity as depending on the groups it belongs to. Its full access is its direct cameras plus all cameras available to those parent groups.
- Because the group graph has no cycles, DFS with memoization (or topological DP) can compute inherited access efficiently without recomputing the same group many times.