From 84b0a2ed0951f567b52d24e14a4b8377e90638c4 Mon Sep 17 00:00:00 2001 From: beauttie <15842537+beauttie@users.noreply.github.com> Date: Thu, 20 May 2021 00:31:26 -0700 Subject: [PATCH 1/2] Draft of possible_bipartition --- lib/possible_bipartition.rb | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/possible_bipartition.rb b/lib/possible_bipartition.rb index 69507f1..cb43706 100644 --- a/lib/possible_bipartition.rb +++ b/lib/possible_bipartition.rb @@ -1,4 +1,23 @@ def possible_bipartition(dislikes) - raise NotImplementedError, "possible_bipartition isn't implemented yet" + return true if dislikes.empty? + + group_num = Array.new(dislikes.length) + group_num[0] = 1 + queue = Queue.new + queue.enq(0) + while !queue.empty? + current = queue.deq + dislikes[current].each do |dog| + if group_num[dog].nil? + group_num[dog] = group_num[current] == 1 ? 2 : 1 + queue.enq(dog) + elsif group_num[dog] == group_num[current] + return false + end + end + queue.enq(current + 1) unless current == dislikes.length - 1 + end + + return true end From 051a691637bb9d8ac5acacacc8b8cc3d37320f7f Mon Sep 17 00:00:00 2001 From: beauttie <15842537+beauttie@users.noreply.github.com> Date: Thu, 20 May 2021 00:42:24 -0700 Subject: [PATCH 2/2] Implement possible_bipartition to pass all tests --- lib/possible_bipartition.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/possible_bipartition.rb b/lib/possible_bipartition.rb index cb43706..e3aa0b5 100644 --- a/lib/possible_bipartition.rb +++ b/lib/possible_bipartition.rb @@ -3,6 +3,7 @@ def possible_bipartition(dislikes) return true if dislikes.empty? group_num = Array.new(dislikes.length) + # Element at index i indicates group number for dog i group_num[0] = 1 queue = Queue.new queue.enq(0) @@ -10,13 +11,15 @@ def possible_bipartition(dislikes) current = queue.deq dislikes[current].each do |dog| if group_num[dog].nil? + # Assign dogs disliked by the current dog to the other group group_num[dog] = group_num[current] == 1 ? 2 : 1 queue.enq(dog) + # If a dog disliked by the current dog is in the same group elsif group_num[dog] == group_num[current] return false end end - queue.enq(current + 1) unless current == dislikes.length - 1 + queue.enq(current + 1) if dislikes[current].empty? end return true