RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚
Algorithm/프로그래머스

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

Algorithm/프로그래머스

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

2022. 5. 25. 14:47
728x90
반응형
 

코딩테스트 연습 - 전력망을 둘로 나누기

9 [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]] 3 7 [[1,2],[2,7],[3,7],[3,4],[4,5],[6,7]] 1

programmers.co.kr

 

문제

n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다.

이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다.

 

이 때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.

 

송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다.

전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 정력망으로 나누었을 때,

두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.

 

풀이

어떻게 풀어야 할지 고민하다 결국 다른 분의 풀이를 참고하였습니다.😢

찾아보니, 입력 값의 크기가 작아 각 간선을 하나씩 검사해서 풀어도

시간 내에 풀 수 있습니다.👍

 

각 간선을 (a,b)라고 했을 때,

(a 부터 시작하는 트리의 크기 - b 부터 시작하는 트리의 크기)의 절대값 중

가장 작은 값을 찾으면 되는 문제입니다.

 

트리의 크기를 구하기 위해서는 BFS(너비우선탐색) 알고리즘을 사용하였습니다.

 

코드

import java.util.*
import kotlin.math.*

class Solution {
	fun solution(n: Int, wires: Array<IntArray>): Int {
    	var answer: Int = n + 1
        
        // 송전탑 연결관계
        val maps = Array(n){ mutableListOf<Int>() }
        wires.forEach{(a,b) ->
        	maps[a-1].add(b-1)
            maps[b-1].add(a-1)
        }
        // 각 간선의 양 옆 트리의 크기의 차가 가장 적은 값
        wires.forEach{(a,b) ->
        	answer = min(answer,
            	abs(bfs(a-1,b-1,n,maps) - bfs(b-1,a-1,n,maps))
            )
        }
        return answer
    }
    // 너비 우선탐색
    fun bfs(s: Int, e: Int, n: Int, maps: Array<MutableList<Int>>): Int {
    	val visited = BooleanArray(n)
        val q: Queue<Int> = LinkedList<Int>()
        
        visited[s] = true
        q.add(e)
        
        var size = 0
        while (q.isNotEmpty()) {
        	val current = q.poll()
            visited[current] = true
            size += 1
            
            for (next in maps[current]) {
            	if (!visited[next]) {
                	q.add(next)
                }
            }
        }
        return size
    }
}
반응형

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

[프로그래머스] Lv 2. n^2 배열 자르기(Kotlin)  (0) 2022.05.26
[프로그래머스] Lv 2. 모음사전  (0) 2022.05.25
[프로그래머스] Lv 2. 배달  (0) 2022.05.25
[프로그래머스] Lv 2. 2개 이하로 다른 비트  (0) 2022.05.13
[프로그래머스] Lv 2. 괄호 회전하기  (0) 2022.05.13
  • 문제
  • 풀이
  • 코드
'Algorithm/프로그래머스' 카테고리의 다른 글
  • [프로그래머스] Lv 2. n^2 배열 자르기(Kotlin)
  • [프로그래머스] Lv 2. 모음사전
  • [프로그래머스] Lv 2. 배달
  • [프로그래머스] Lv 2. 2개 이하로 다른 비트
RIEN😚
RIEN😚
안드로이드 / 코틀린 독학으로 취업하자!

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.