99클럽 코테 스터디 24일차 TIL

2024. 11. 20. 15:41·코딩테스트/99클럽 4기

프로그래머스 - 전력망을 둘로 나누기

풀이

주어진 wires를 모두 한 번씩 끊었을 때 나올 수 있는 각각의 전력망에서,

송전탑의 개수를 비교하여 차이를 반환해야 한다.

 

모든 wires를 끊어보려면 반복을 돌 때마다 전선 환경을 초기화해줘야 한다.

만약 1, 3번 전선을 끊었을 때의 송전탑 차이를 계산했다면

계산한 값을 저장해두고 끊었던 전선을 다시 연결해줘야 한다.

위 과정을 반복해서 송전탑 차이가 가장 적은 값을 반환해 주면 된다.

 

구현

import java.util.*;

class Solution {
    private List<Integer>[] tree;
    private boolean[] visited;

    public int solution(int n, int[][] wires) {
        int answer = Integer.MAX_VALUE;

        // 전선 트리 초기화
        tree = new LinkedList[n + 1];
        for (int i = 1; i <= n; i++) {
            tree[i] = new LinkedList<>();
        }

        // 전선 연결
        for (int i = 0; i < wires.length; i++) {
            tree[wires[i][0]].add(wires[i][1]);
            tree[wires[i][1]].add(wires[i][0]);
        }

        // 모든 전선을 하나씩 끊었을 때 전력망마다 가지게 되는 송전탑 수를 구한다.
        // 분리된 전력망의 송전탑 차를 구한다.
        // 위 과정을 반복하면서 송전탑 차의 최솟값을 반환한다.
        for (int i = 0; i < wires.length; i++) {
            // 전선 끊기 - 전력망 분리
            tree[wires[i][0]].remove(Integer.valueOf(wires[i][1]));
            tree[wires[i][1]].remove(Integer.valueOf(wires[i][0]));

            // 송전탑 방문 초기화
            visited = new boolean[n + 1];

            // 분리된 전력망의 송전탑 갯수를 구한다.
            int count = bfs(1);
            answer = Math.min(answer, Math.abs(count - (n - count)));

            tree[wires[i][0]].add(wires[i][1]);
            tree[wires[i][1]].add(wires[i][0]);
        }

        return answer;
    }

    private int bfs(int start) {
        Queue<Integer> queue = new ArrayDeque<>();
        queue.add(start);
        visited[start] = true;

        int count = 1;
        while (!queue.isEmpty()) {
            int current = queue.remove();

            for (int node : tree[current]) {
                if (!visited[node]) {
                    visited[node] = true;
                    queue.add(node);
                    count++;
                }
            }
        }

        return count;
    }
}

 

DFS 로 구현한 사례들도 많았지만 사고가 너무 깊어지고 이해하기 힘들어 BFS로 구현했다.


프로그래머스 - 전력망을 둘로 나누기

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

참고

 

[프로그래머스/Lv. 2] 전력망을 둘로 나누기 (JAVA)

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

bono039.tistory.com

 

[프로그래머스]level 2: 전력망 둘로 나누기_Java(위클리 9주차)

[문제] n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되

arinnh.tistory.com

저작자표시 (새창열림)

'코딩테스트 > 99클럽 4기' 카테고리의 다른 글

99클럽 코테 스터디 26일차 TIL  (0) 2024.11.22
99클럽 코테 스터디 25일차 TIL  (0) 2024.11.21
99클럽 코테 스터디 23일차 TIL  (0) 2024.11.19
99클럽 코딩 테스트 22일차 TIL  (1) 2024.11.18
99클럽 코테 스터디 21일차 TIL  (0) 2024.11.17
'코딩테스트/99클럽 4기' 카테고리의 다른 글
  • 99클럽 코테 스터디 26일차 TIL
  • 99클럽 코테 스터디 25일차 TIL
  • 99클럽 코테 스터디 23일차 TIL
  • 99클럽 코딩 테스트 22일차 TIL
tjdgus
tjdgus
  • tjdgus
    Do It...
    tjdgus
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Language
        • Java
      • CS
        • Data Structure
        • OS
        • Algorithm
        • Network
      • 오류 모음집
      • ETC
      • 함수형 프로그래밍
      • JPA
      • Toy
      • 데이터베이스
      • Spring
      • 코딩테스트
        • 99클럽 4기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    TiL
    티스토리챌린지
    코딩테스트준비
    오블완
    항해99
    99클럽
    개발자취업
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
tjdgus
99클럽 코테 스터디 24일차 TIL
상단으로

티스토리툴바