1. ๋ฌธ์ ์ ๋ํ์ฌ ๐ฆ
(1) ์กฐ๊ฑด ๋ถ์ ๐
- ํ๋์ ์ฐ๊ฒฐ๋ ํธ๋ฆฌ๊ฐ ๋์จ๋ค.
- ํด๋น ํธ๋ฆฌ์ ๊ฐ์ ์ค ํ๋๋ฅผ ๋์์ ๋, ํธ๋ฆฌ๊ฐ 2๋ถํ ๋ ํ ๋ฐ, ํด๋น 2๋ถํ ๋ ํธ๋ฆฌ๊ฐ์ ์ ์ ์ฐจ์ด๋ฅผ ์ต์ํ ํ๋ผ.
2. ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐ ๏ธ
KEY WORD
: ์์ ํ์
, bfs
๊ฐ์ ์ ์ต๋ ๊ฐ์๊ฐ 99๊ฐ๋ผ์, ํ๋์ฉ ๋์ด๋ณด๋ฉด์ ํด๋ ๋ ๊ฑฐ ๊ฐ์, ์์ ํ์์ ํ์ฉํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ์งํ๋๋ค.
- ์ธ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ (์๋ฐฉํฅ ๊ทธ๋ํ์ฌ์ผํจ ์ฃผ์)
- ์ํํ๋ฉด์ ์ง์ธ ๊ฐ์ ์ ํ๋ ์ ํํ๊ธฐ
- ํด๋น ๊ฐ์ ์ ์ง์ฐ๊ณ , ๋๋ ์ง ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ๋ํด์ BFS๋ฅผ ๋๋ฉฐ ๊ฐ๊ฐ์ด ๋ณด์ ํ ์ ์ ๊ฐ์ ์ธ๊ธฐ
- ์ ์ ๊ฐ์ ๊ฐ์ ์ฐจ๋ฅผ ๊ตฌํด์ ์ฐจ์ด ์ต์๊ฐ ๊ฐฑ์
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ โณ
์ ์ ์ ๊ฐ์
: n ๊ฐ๊ฐ์ ์ ๊ฐ์
: n-1๊ฐ
๊ฐ์ ํ๋๋ง๋ค n๊ฐ์ ์ ์ ์ ๋ํ BFS ๋ฐ๋ณต.
๋ฐ๋ผ์ $O( (n-1) \times (n + n-1))$
3. ์ฝ๋ ๐
(1) SUDO CODE ๐ฌ
0. ์ธ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ (์๋ฐฉํฅ ๊ทธ๋ํ์ฌ์ผํจ ์ฃผ์)
1. ์ํํ๋ฉด์ ์ง์ธ ๊ฐ์ ์ ํ๋ ์ ํํ๊ธฐ
2. ํด๋น ๊ฐ์ ์ ์ง์ฐ๊ณ , ๋๋ ์ง ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ๋ํด์ BFS๋ฅผ ๋๋ฉฐ ๊ฐ๊ฐ์ด ๋ณด์ ํ ์ ์ ๊ฐ์ ์ธ๊ธฐ
3. ์ ์ ๊ฐ์ ๊ฐ์ ์ฐจ๋ฅผ ๊ตฌํด์ ์ฐจ์ด ์ต์๊ฐ ๊ฐฑ์
(2) JAVA CODE โ
import java.util.*;
class Solution {
static ArrayList<Integer> [] lists;
public int solution(int n, int[][] wires) {
int answer = Integer.MAX_VALUE;
lists = new ArrayList [n + 1];
for(int i = 1; i < n+1; i++){
lists[i] = new ArrayList<>();
}
for(int i = 0; i < wires.length; i++){
int left = wires[i][0];
int right = wires[i][1];
lists[left].add(right);
lists[right].add(left);
}
for(int i = 0; i < wires.length; i++){
int left = wires[i][0];
int right = wires[i][1];
lists[left].remove(Integer.valueOf(right));
lists[right].remove(Integer.valueOf(left));
int left_cnt = bfs(left, n);
int right_cnt = bfs(right, n);
answer = Math.min(answer, Math.abs(left_cnt - right_cnt));
lists[left].add(right);
lists[right].add(left);
}
return answer;
}
public int bfs(int start, int n) {
int answer = 0;
boolean [] isVisited = new boolean [n+1];
ArrayDeque<Integer> aq1 = new ArrayDeque<>();
isVisited[start] = true;
aq1.add(start);
while(!aq1.isEmpty()){
int now = aq1.poll();
for(int i = 0; i < lists[now].size(); i++){
int next = lists[now].get(i);
if(isVisited[next]) continue;
answer++;
isVisited[next] =true;
aq1.add(next);
}
}
return answer;
}
}
4. ํธ๋ฌ๋ธ ์ํ or ๋ฐฐ์ด ์ ๐
(1) ์ฒซ ๋ฒ์งธ ํ์ด์์์ ๋ฐฐ์ด ์
- ์ ๋์จ ํ์ธ๋๋ก ๋ถ๋ถ์งํฉ ๋ณ ์ ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ค๊ณ ํ๋๋ฐ, ์ด์งํผ 2๊ฐ๋ก ๋๋์ด์ง๋ ๊ฒ ํ์ ๋ ์ํฉ์์ ์ค๋ฒ ์คํ ์๊ณ ๋ฆฌ์ฆ์ธ ๊ฑฐ ๊ฐ๋ค.
- ํ๋์ ํธ๋ฆฌ๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค๋ ์ง๋ฌธ์ ๋ชป ๋ณด๊ณ ์ง๋์ณ์ ๋ฌธ์ ๋ฅผ ์ด๋ ต๊ฒ ํ์๋ค.
(2) list ์๋ฃ ๊ตฌ์กฐ์ remove ์ฌ์ฉ ์ ์ฃผ์์
list.remove (int index)
์ list.remove(Object o)
๋ ๊ฐ๊ฐ ์๋ค. ์ ์๋ ์ธ์์ ๊ฐ์ index์ ๊ฐ์ ์ง์ฐ๋ ๊ฒ์ด๊ณ , ๋์งธ๋ ์ธ์์ ๊ฐ์ value ๊ฐ์ ์ง์ฐ๋ ๊ฒ์ด๋ค.
์์ ํ์ด์์ list์ ์ ์ฅ๋ value์ ์๋ฃ๊ตฌ์กฐํ ๋ํ int์ Wrapperํ์ธ Integer์ธ๋ฐ ์ด๋ฅผ ๊ฐ๊ณผํ๋ค. int ํ value ๊ฐ์ ์ง์ฐ๋ ค๋ ์๋ ์๋๋ฐ ์๊ฐ์์ด list.remove(int i)
๋ฅผ ์ผ๋ค๊ฐ index๋ฅผ ์ง์ฐ๋ ์ ์๊ฐ ์จ์ ธ์ ์ค๋ฅ๊ฐ ๋ฌ๋ค.
๋ง์ฝ Integerํ List์์ Integerํ value๋ฅผ ๊ทธ๋๋ก ์ง์ฐ๋ ค๋ฉด, intํ ์ธ์๋ฅผ Integer๋ก Wrapping ์์ผ์ค์ ๋ ๋ฒ์งธ ํจ์๊ฐ ์ฌ์ฉ๋๋๋ก ์ ๋ํ์.
์ถ์ฒ: java 8 ๊ณต์ ๋ฌธ์