|  | 
|  | 1 | +package com.fishercoder.solutions; | 
|  | 2 | + | 
|  | 3 | +import java.util.HashMap; | 
|  | 4 | +import java.util.Map; | 
|  | 5 | + | 
|  | 6 | +public class _1583 { | 
|  | 7 | +    public static class Solution1 { | 
|  | 8 | +        public int unhappyFriends(int n, int[][] preferences, int[][] pairs) { | 
|  | 9 | +            int unhappyFriends = 0; | 
|  | 10 | +            Map<Integer, Integer> assignedPair = new HashMap<>(); | 
|  | 11 | +            for (int[] pair : pairs) { | 
|  | 12 | +                assignedPair.put(pair[0], pair[1]); | 
|  | 13 | +                assignedPair.put(pair[1], pair[0]); | 
|  | 14 | +            } | 
|  | 15 | +            for (int[] pair : pairs) { | 
|  | 16 | +                if (isUnHappy(pair[1], pair[0], preferences, assignedPair)) { | 
|  | 17 | +                    unhappyFriends++; | 
|  | 18 | +                } | 
|  | 19 | +                if (isUnHappy(pair[0], pair[1], preferences, assignedPair)) { | 
|  | 20 | +                    unhappyFriends++; | 
|  | 21 | +                } | 
|  | 22 | +            } | 
|  | 23 | +            return unhappyFriends; | 
|  | 24 | +        } | 
|  | 25 | + | 
|  | 26 | +        private boolean isUnHappy(int self, int assignedFriend, int[][] preferences, Map<Integer, Integer> assignedPairs) { | 
|  | 27 | +            int[] preference = preferences[self]; | 
|  | 28 | +            int assignedFriendPreferenceIndex = findIndex(preference, assignedFriend); | 
|  | 29 | +            for (int i = 0; i <= assignedFriendPreferenceIndex; i++) { | 
|  | 30 | +                int preferredFriend = preference[i]; | 
|  | 31 | +                int preferredFriendAssignedFriend = assignedPairs.get(preferredFriend); | 
|  | 32 | +                if (preferredFriendAssignedFriend == self) { | 
|  | 33 | +                    return false; | 
|  | 34 | +                } | 
|  | 35 | +                int candidateAssignedFriendIndex = findIndex(preferences[preferredFriend], preferredFriendAssignedFriend); | 
|  | 36 | +                if (isPreferred(self, preferences[preferredFriend], candidateAssignedFriendIndex)) { | 
|  | 37 | +                    return true; | 
|  | 38 | +                } | 
|  | 39 | +            } | 
|  | 40 | +            return false; | 
|  | 41 | +        } | 
|  | 42 | + | 
|  | 43 | +        private boolean isPreferred(int self, int[] preference, int boundary) { | 
|  | 44 | +            for (int i = 0; i <= boundary; i++) { | 
|  | 45 | +                if (self == preference[i]) { | 
|  | 46 | +                    return true; | 
|  | 47 | +                } | 
|  | 48 | +            } | 
|  | 49 | +            return false; | 
|  | 50 | +        } | 
|  | 51 | + | 
|  | 52 | +        private int findIndex(int[] preference, int assignedFriend) { | 
|  | 53 | +            for (int i = 0; i < preference.length; i++) { | 
|  | 54 | +                if (preference[i] == assignedFriend) { | 
|  | 55 | +                    return i; | 
|  | 56 | +                } | 
|  | 57 | +            } | 
|  | 58 | +            return 0; | 
|  | 59 | +        } | 
|  | 60 | +    } | 
|  | 61 | +} | 
0 commit comments