๐ 886. Possible Bipartition
Possible Bipartition - LeetCode
Input: n = 4, dislikes = [[1,2],[1,3],[2,4]]
Output: true
Explanation: group1 [1,4] and group2 [2,3].
๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ง๊ณ ํจ๊ป ์์ ์ ์๋ ์ซ์๋ค์ด 2์ฐจ์ ๋ฐฐ์ด๋ก ์ฃผ์ด์ง๋ค.
1์ 2์ 3๊ณผ ํจ๊ป ํ ์ ์๊ณ
2๋ 1๊ณผ 4์ ํจ๊ป ์์ ์ ์๋ค
์ฃผ์ด์ง๋ n๊ฐ์ ์๋ฅผ ์์ ์ฃผ์ด์ง๋ ๋ฆฌ์คํธ์ ์ฐธ๊ณ ํด์ ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ผ ํ๋ค.
๋ง์ฝ์ ๋๊ทธ๋ฃน์ผ๋ก ๋๋ ์ด์ง๋ฉด True ๋๋์ง ๋ชปํ๋ฉด False์ด๋ค.
โ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์ฒ์ ์๊ฐํด๋ณด๋ฉด
์ผ๋จ ๊ฐ ์ซ์๋ค์ด ์ด๋ค ์ซ์์ ํจ๊ป ํ ์ ์๋์ง๋ฅผ ๋์ ๋๋ฆฌ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ์ ๋ฆฌํ๋ค.
์ด์ ์ด๊ฑธ ๋ฐฐ์นํด์ผ ํ๋๋ฐ dictionary์์ for๋ฌธ์ ๋๋ฉด์ ์ค๋ณต๋๋๊ฒ ์๋์ง ํ์ธํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
from typing import List
class Solution:
def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:
dislike_dic = {}
for dislike in dislikes:
item1 = dislike[0]
item2 = dislike[1]
if item1 in dislike_dic:
dislike_dic[item1].append(item2)
else:
dislike_dic[item1] = [item2]
if item2 in dislike_dic:
dislike_dic[item2].append(item1)
else:
dislike_dic[item2] = [item1]
-
Code(์๋ชป๋ ์ฝ๋์)
group1 = set()
group2 = set()
for i in range(1, n + 1):
group_name = None
lst_dislike = []
if i in dislike_dic:
lst_dislike = dislike_dic[i]
group_name = ''
for dislike in lst_dislike:
if dislike in group1:
if dislike in group2:
return False
if group_name == '':
group_name = 'group2'
elif group_name != 'group2':
# could this element be in group2?
if not self.could_be_in_another_group(dislike_dic, dislike, group2, group1):
return False
group_name = 'group2'
elif dislike in group2:
if dislike in group1:
return False
if group_name == '':
group_name = 'group1'
elif group_name != 'group1':
if not self.could_be_in_another_group(dislike_dic, dislike, group1, group2):
return False
group_name = 'group1'
if group_name == '' or group_name == 'group1':
group1.add(i)
else:
group2.add(i)
return True
def could_be_in_another_group(self, dislike_dic, dislike, from_group, to_group):
if dislike in dislike_dic:
lst_dislike = dislike_dic[dislike]
for dislike2 in lst_dislike:
if dislike2 in from_group:
if self.could_be_in_another_group(dislike_dic, dislike2, from_group, to_group):
from_group.remove(dislike2)
to_group.add(dislike2)
else:
return False
return True
๋ณด๋ฉด ์๊ฒ ์ง๋ง ๋ณ ๋๋ฆฌ๋ฅผ ๋ค ๋ถ๋ ธ๋ค.
์ฝ๋๊ฐ ๋๋ฌด ์ง์ ๋ถํด์ ๋ฆฌํํ ๋ง ํ๋ค๊ฐ
Chat GPT์๊ฒ ๋ฆฌํฉํ ๋ง์ ๋ถํํด ๋ณด์๋ค.
-
Code(์๋ชป๋ ์ฝ๋ ๋ฆฌํฉํ ๋ง)
groups = [set(), set()]
for i in range(1, n + 1):
group_name = None
lst_dislike = dislike_dic.get(i, [])
group_name = ''
for dislike in lst_dislike:
group_index = None
if dislike in groups[0]:
group_index = 0
elif dislike in groups[1]:
group_index = 1
if group_index is not None:
if group_name == '':
group_name = group_index
elif group_name != group_index:
if not self.could_be_in_another_group(dislike_dic, dislike, groups[group_index], groups[group_index ^ 1]):
return False
group_name = group_index
if group_name == '':
groups[0].add(i)
elif group_name == 0:
groups[0].add(i)
else:
groups[1].add(i)
return True
def could_be_in_another_group(self, dislike_dic, dislike, from_group, to_group):
if dislike in dislike_dic:
lst_dislike = dislike_dic[dislike]
for dislike2 in lst_dislike:
if dislike2 in from_group:
if self.could_be_in_another_group(dislike_dic, dislike2, from_group, to_group):
from_group.remove(dislike2)
to_group.add(dislike2)
else:
return False
return True
์ค~~~ ์ํ๋ค ์ํด
๊ฒฐ๋ก ์ ? ํด๊ฒฐ์๋จ
๋ฌธ์ ๋ dictionary์์ for๋ฌธ์ ๋๋ค๊ฐ ์์ ํ๋๊ฐ 10์ด๋ผ๊ณ ํ์๋ ์์ชฝ ๊ทธ๋ฃน์ ๋ค๋ค์ด๊ฐ ์ ์๋ ๊ฒฝ์ฐ์
์ผ๋จ ํ๋์ ๊ทธ๋ฃน์ ๋ฃ์ด๋๋ฉด ๋ค์ 22์ฏค ์์๋ ์ผ๋จ ํ๋์ ๊ทธ๋ฃน์ ๋ฃ์ด๋ 10์ด ๋ฌธ์ ๊ฐ ๋๊ณ
๊ทธ๋ผ 10์ ๋ค์ ํ์ธํด์ ๋ค๋ฅธ ๊ทธ๋ฃน์ ๋ฃ์ด์ผ ํ๋๋ฐ ๋ฃ๋๋ค๊ณ ๋ค๊ฐ ์๋๋ผ 1~22๋ฒ๊น์ง ๋ค์ ํ์ธํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
๋ชปํ์๋ค GG ๐ญ
ai์๊ฒ ๋ฌผ์ด๋ณด๋ ๋ต์ ์๋ ค์ฃผ๋๋ฐ ํน์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋จ๋คโฆ
์ด๋ฐ ํน์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํด์ผ ํ๋๊ฐ???
๊ทธ๋ผ ์ด๊ฑด ์ข ์ ์ธํ๊ณ
๋ค์ ์ฒ์๋ถํฐ ์๊ฐํ๊ธฐ๋กโฆ
(์ด๋ฒ ๋ฌธ์ ๋ ์ด๋ ต๋ค ใ .ใ )
์ธ์๊ฐ ์ด๋ ๊ฒ ์ฃผ์ด์ก์ ๋
Input: n = 4, dislikes = [[1,2],[1,3],[2,4]]
- ๊ฐ ์๋ณ๋ก ์ด๋ค์์ ํจ๊ป ํ ์ ์๋์ง ํ์ธ
- ๊ฐ ๊ทธ๋ฃน๋ณ๋ก 1๊ณผ ํจ๊ป ํ ์ ์๋ ์๊ฐ ์๋์ง ๋จผ์ ๊ฒ์ฌ
- ํ์ฌ group1 = [ ] group2 = [ ]
- ๋๋ค ๊ฐ๋ฅํ๋ค๋ฉด group1 = [ 1 ]
- ๋ค๋ฅธ ๊ทธ๋ฃน์ 1๊ณผ ํจ๊ป ํ ์ ์๋ ์์ธ 2, 3์ ๋ฐ๋์ ๋ฃ์ด์ผํจ
- 2์ 3์ด ํจ๊ป ํ ์ ์๋์ง ๊ฒ์ฌ
- 2์ ํจ๊ป ํ ์ ์๋ ๋ฆฌ์คํธ ๊ตฌํ๊ธฐ
- 3๊ณผ ํจ๊ป ํ ์ ์๋ ๋ฆฌ์คํธ ๊ตฌํ๊ธฐ
- ๊ฐ ๋ฆฌ์คํธ๋ค ํ๋๋ก ํฉ์น๊ธฐ
- 2์ 3์ด ํฉ์ณ์ง ๋ฆฌ์คํธ ์์ ์๋์ง ํ์ธํ๊ธฐ
- ๊ฐ๋ฅํ๋ค๋ฉด 2์ 3์ ํ๋ฒ์ group2์ ๋ค์ด๊ฐ๋ค.
- 2์ 3์ด ํฉ์ณ์ง ๋ฆฌ์คํธ ์์ ์๋ค๋ฉด return False
- ๋ชจ๋ for๋ฌธ์ด ๋ค ๋์๊ฐ๋ฉด ์๋์ผ๋ก return True
๊ฒฐ๊ณผ๋ ๊ธฐ์กด๋ณด๋ค ๋ชปํ ๊ฒฐ๊ณผ๊ฐโฆ.์ ๋ ํ๋ฆผ
-
์ฝ๋
from typing import List
class Solution:
def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:
dislike_dic = {}
for dislike in dislikes:
item1 = dislike[0]
item2 = dislike[1]
if item1 in dislike_dic:
dislike_dic[item1].append(item2)
else:
dislike_dic[item1] = [item2]
if item2 in dislike_dic:
dislike_dic[item2].append(item1)
else:
dislike_dic[item2] = [item1]
groups = [[], []]
joined_element = set()
for key in dislike_dic:
if key in joined_element:
continue
else:
joined_element.add(key)
lst_dislike = dislike_dic.get(key, [])
merge_set = set()
for dislike in lst_dislike:
items = dislike_dic.get(dislike, [])
for item in items:
merge_set.add(item)
# ์๊ธฐ์์ ๋ถํฐ ๋จผ์ ๊ฒ์ฌ
# dislike๋ค์ด ํจ๊ป ํ ์ ์๋์ง ๋ถํฐ ๊ฒ์ฌํจ
for item in lst_dislike:
if item in merge_set:
return False
joined_element.add(item)
# ๋ง์ฝ ํจ๊ป ํ ์ ์๋ค๋ฉด ์ด๋ ๊ทธ๋ฃน์ผ๋ก ๊ฐ์ผํ ์ง ๊ฒ์ฌ
idx_group = 0
for item in groups[0]:
if item in merge_set:
idx_group = 1
break
for item in groups[1]:
if item in merge_set and idx_group == 1:
return False
groups[idx_group].append(key)
# ์๋๋ฐฉ์ชฝ์ ์๋ ๊ฒ๋ค์ ์ ์ธํ๋ค.
for dislike in lst_dislike:
if dislike not in groups[idx_group]:
groups[idx_group ^ 1].append(dislike)
return True
๋ช์ผ์ ์งฌ์งฌ์ด ์๊ฐ๋ ๋๋ง๋ค ๊ณ ๋ฏผํด๋ดค๋๋ฐ ๊ฒฐ๊ตญ Recursive๋ฅผ ์ฌ์ฉํด์ผ ํ ์ ์์ ๊ฒ ๊ฐ์๋ค.
๊ฒฐ๊ตญ ์ค๋๋ ์คํจํ๊ณ โฆ ์
์๊ณ ๋ฆฌ์ฆ์ ๋์์ ์ข ๋ฐ์๋ค. ใ .ใ
from typing import List
class Solution:
def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:
dislike_dic = {}
for dislike in dislikes:
item1 = dislike[0]
item2 = dislike[1]
if item1 in dislike_dic:
dislike_dic[item1].append(item2)
else:
dislike_dic[item1] = [item2]
if item2 in dislike_dic:
dislike_dic[item2].append(item1)
else:
dislike_dic[item2] = [item1]
groups = {}
for n in range(1, n+1):
color = groups.get(n, -1)
if color == -1:
groups[n] = 0
if not self.coloring(groups, dislike_dic, n, 0):
return False
return True
def coloring(self, groups: dict, dislike_dic: dict, n: int, color: int):
coloring = color ^ 1
lst_dislike = dislike_dic.get(n, [])
for i in lst_dislike:
i_color = groups.get(i, -1)
if i_color == -1:
groups[i] = coloring
self.coloring(groups, dislike_dic, i, coloring)
elif i_color != coloring:
return False
return True
ํต์ฌ์ฝ๋๋
self.coloring(groups, dislike_dic, i, coloring)
์ด๋ถ๋ถ์ด๋ค.
for๋ฌธ์ ๋๋ฆฌ๋ฉด์ 1๋ถํฐ n๊น์ง ๋๋๋ฐ ๋ด๊ฐ ์ coloringํ ๋ถ๋ถ๊ณผ ์ฐ๊ด๋ dislike๋ ์ ๋ถ coloring์ฒ๋ฆฌ ํด์ค์ผํ๊ณ ์ผ๋จ ๋ค coloring ๋๋ฉด ๋ค์ n์ธ 2๋ฅผ ์์ํ๋ ๊ฒ์ด๋ค.
for๋ฌธ๊ณผ recursive๋ฅผ ๋์์ ํ์ฉํด์ ํด๊ฒฐํด์ผ ํ๋ ๋ฌธ์ ์ด๋ค.!!
copilot ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ ์ง ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
class Solution:
def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:
lst_dislikes = [[] for _ in range(0, n+1)]
for a, b in dislikes:
lst_dislikes[a].append(b)
lst_dislikes[b].append(a)
colors = [-1 for _ in range(0, n+1)]
for n in range(1, n+1):
if colors[n] == -1 and not self.coloring(lst_dislikes, colors, n, 0):
return False
return True
def coloring(self, lst_dislikes: List[List[int]], colors:List[int], n: int, color: int):
if colors[n] != -1:
return colors[n] == color
colors[n] = color
for i in lst_dislikes[n]:
if not self.coloring(lst_dislikes, colors, i, color ^ 1):
return False
return True
ํจ์ฌ ๊ฐ๋จํ๊ณ ๋น ๋ฅด๋ค.
copilot์๋ณธ์ ์๋์ ๊ฐ๋ค.
from typing import List
class Solution:
def possibleBipartition(self, n: int, dislikes: List[List[int]]) -> bool:
lst_dislikes = [[] for _ in range(n)]
for i, j in dislikes:
lst_dislikes[i - 1].append(j - 1)
lst_dislikes[j - 1].append(i - 1)
lst_color = [0] * n
for i in range(n):
if lst_color[i] == 0:
lst_color[i] = 1
if not self.dfs(lst_dislikes, lst_color, i):
return False
return True
def dfs(self, lst_dislikes, lst_color, i):
for j in lst_dislikes[i]:
if lst_color[j] == lst_color[i]:
return False
if lst_color[j] == 0:
lst_color[j] = -lst_color[i]
if not self.dfs(lst_dislikes, lst_color, j):
return False
return True