86971. 전력망을 둘로 나누기

2023. 10. 31. 17:55·프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/86971

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

def solution(n, wires): # 송전탑의 개수 n, 전선 정보 wires

    def find(x,parent):     # 부모 찾기
        if parent[x] < 0:
            return x
        parent[x] = find(parent[x],parent)
        return parent[x]

    def union(x, y,parent):  # 합침
        x = find(x,parent)
        y = find(y,parent)
        if x == y:
            return -1
        if parent[x] < parent[y]:
            parent[x] += parent[y]
            parent[y] = x
        elif parent[x] > parent[y]:
            parent[y] += parent[x]
            parent[x] = y
        else:
            parent[y] += parent[x]
            parent[x] = y
        return 1

    answer = n
    for i in range(len(wires)):
        parent = [-1]*(n+1)

        for a,b in (wires[:i] + wires[i+1:]):
            union(a,b,parent)

        group1 = parent[find(wires[i][0],parent)]
        group2 = parent[find(wires[i][1],parent)]
        answer = min(answer, abs(group1-group2))
    return answer

실패 코드

def solution(n, wires): # 송전탑의 개수 n, 전선 정보 wires

    import copy
    min_cnt = 100000

    def find_set(x):  # 대표자 출력
        if parent[x] == x:
            return x
        parent[x] = find_set(parent[x])
        return parent[x]

    def union(x, y):  # 둘을 합침
        x = find_set(x)
        y = find_set(y)
        if x == y:
            return
        if x > y:
            parent[x] = y
        else:
            parent[y] = x

    for i in range(len(wires)):

        wires_2 = copy.deepcopy(wires)
        wires_2.pop(i)
        parent = [x for x in range(n)]

        for wire in wires_2:
            a, b = wire
            union(a-1,b-1)
        #### 첫 번째 예시에서 첫 번째 전선을 없앴을 때 parent가 [0,1,1,1,1,1,1,1,1] 이런식으로 나오는지 모를 일...
        res = set()
        for j in parent:
            if j != 0:
                res.add(j)

        if len(res) == 2:

            lst = []
            for r in res:
                lst.append(r)

            if min_cnt > abs(parent.count(lst[0])-parent.count(lst[1])):
                min_cnt = abs(parent.count(lst[0])-parent.count(lst[1]))

    return min_cnt

+ bfs 풀이

from collections import deque

def bfs(start, remove, visited, links):
    q = deque([start])
    visited[start] = 1
    cnt = 1
    while q:
        now = q.popleft()
        for nxt in links[now]:
            if not visited[nxt] and nxt != remove:
                visited[nxt] = True
                q.append(nxt)
                cnt += 1
    return cnt
    
def solution(n, wires):
    ans = float('inf')
    links = [[] for _ in range(n+1)]
    for a, b in wires: # 양방향 저장
        links[a].append(b)
        links[b].append(a)
        
    for a, b in wires:
        visited = [-1] * (n+1)
        # 하나의 간선을 제거하고 제거된 간선과 연결된 두 노드를 루트 노드로 하여 bfs를 수행
        count1 = bfs(a, b, visited, links) 
        count2 = bfs(b, a, visited, links)
        diff = abs(count1-count2)
        if diff < ans:
            ans = diff
    return ans
저작자표시 (새창열림)

'프로그래머스' 카테고리의 다른 글

프로그래머스 92341. 주차 요금 계산  (0) 2023.11.09
프로그래머스 72413. 합승 택시 요금  (0) 2023.11.08
프로그래머스 42898. 등굣길  (0) 2023.11.07
프로그래머스 42883. 큰 수 만들기  (0) 2023.11.02
프로그래머스 118666. 성격 유형 검사하기  (0) 2023.10.27
'프로그래머스' 카테고리의 다른 글
  • 프로그래머스 72413. 합승 택시 요금
  • 프로그래머스 42898. 등굣길
  • 프로그래머스 42883. 큰 수 만들기
  • 프로그래머스 118666. 성격 유형 검사하기
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (382)
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅 (5)
      • Html (1)
      • Css (3)
      • Django (0)
      • vue (0)
      • Java (2)
      • Python (0)
      • 독서 (1)
      • 기타 (3)
      • 백준 (192)
      • swea (31)
      • 프로그래머스 (30)
      • 이코테 (4)
      • 99클럽 코테 스터디 (30)
      • ssafy (31)
      • IT기사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    코딩테스트준비
    99클럽
    항해99
    Til
    개발자취업
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
86971. 전력망을 둘로 나누기
상단으로

티스토리툴바