
๐ ๋ฌธ์

๐ฑ ์์ด๋์ด
์ ๋ฌธ์ ์์ ์น๊ตฌ๊ฐ ๋ ์์์ ์ ๋ณด๋ฅผ ์ฐจ๋ก์ฐจ๋ก ์ ๊ณตํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋จ๊ณ๋ง๋ค ํด๋น ์น๊ตฌ๊ฐ ์ํ ๋คํธ์ํฌ(์งํฉ)์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค!
ํฌ๊ฒ ์๊ฐํด์ผ ํ๋ ์ ์ ๋ ๊ฐ์ง๊ฐ ์๋ค.
1. ์น๊ตฌ์ ์ ๋ณด๊ฐ ์ด๋ฆ(๋ฌธ์์ด)์ผ๋ก ์ ๊ณต๋๋ ์
2. ์น๊ตฌ ๋คํธ์ํฌ(์งํฉ)์ ์ํ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ.
1๋ฒ์ ๊ฒฝ์ฐ๋
HashMap์ ์ฌ์ฉํ์ฌ key : ์ด๋ฆ -> value : ๋ฒํธ๋ก ์นํํด์ ์ ๋์จํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๋ฉด ๋๋ค.
๋น์ฐํ ํด์ฌ๋งต์ ์ด๋ฆ์ด ์๋์ง ํ๋จํด์ผ ํ๊ณ . ์๋ค๋ฉด ๋ฒํธ๋ฅผ ๋ถ์ฌํ๋ค.
2๋ฒ์ ๊ฒฝ์ฐ๋
์ ๋์จ ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ณ ๊ทธ์ค union ํจ์์์
๋ ๋ ธ๋์ ๋ถ๋ชจ๋ ธ๋๊ฐ ๋ค๋ฅด๋ค๋ฉด? -> ์๋ก ๋ค๋ฅธ ๋ ธ๋์ -> ์น๊ตฌ๊ฐ ๋์๊ธฐ ๋๋ฌธ์ ans [๋ถ๋ชจ๋ ธ๋] += ans [์์๋ ธ๋]๋ก ์ ๋ฐ์ดํธ ํ ์ถ๋ ฅ
์์๋ ธ๋์ ๋ถ๋ชจ๋ ธ๋๋ฅผ ํ์๋ฅผ ํด์ค๋ค, ์ฆ ๊ฐ์ ์น๊ตฌ๋คํธ์ํฌ ํ์๋ฅผ ํด์ค๋ค.
๋ ๋ ธ๋์ ๋ถ๋ชจ๋ ธ๋๊ฐ ๊ฐ๋ค๋ฉด? -> ์ด๋ฏธ ๊ฐ์ ๋คํธ์ํฌ(์งํฉ) ์ -> ์ ์ ํฉ์ณค๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ ์ถ๋ ฅ
์ด๋ฐ ํ๋ฆ์ผ๋ก ์ถ๋ ฅ์ ํ๋ค๋ฉด ๋ต์ ๊ตฌํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ ์ต๋ ํฌ๊ธฐ๋ฅผ 200,000์ธ ์ด์ ๋
F == 100,000 ์ธ๊ฒฝ์ฐ ์น๊ตฌ 1, ์น๊ตฌ 2 ๊ฐ ๋งค๋ฒ ๋ค๋ฅด๋ค๋ฉด ์ด 200,000์ ์น๊ตฌ(๋ ธ๋)๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ฑ ์ฝ๋ ๋ฐ ํ์ด
| public class Main { | |
| public static int[] parent; | |
| public static int[] ans; | |
| public static HashMap<String, Integer> map = new HashMap<>(); | |
| // ๋ถ๋ชจ๋ ธ๋ ์ฐพ๊ธฐ | |
| public static int find(int x) { | |
| if (parent[x] == x) return x; | |
| return parent[x] = find(parent[x]); | |
| } | |
| // ์งํฉ์ ํฌํจํ๊ธฐ. | |
| public static void union(int x, int y) { | |
| int from = find(x); | |
| int to = find(y); | |
| if (from != to) { | |
| // ์๋ก ๋ค๋ฅธ ๋ ธ๋์๋ค๋ฉด ํด๋น ๋ ธ๋ ๋ณ ์น๊ตฌ ans(๋ถ๋ชจ๋ ธ๋)์ ํฉ์น๊ธฐ. | |
| ans[from] += ans[to]; | |
| parent[to] = from; // ๋ถ๋ชจ๋ ธ๋ ํ์. | |
| } | |
| // ์ด๋ฏธ ์น๊ตฌ๋ผ๋ฉด ans ๋ฐฐ์ด์ ๋ํด์ค ํ์ ์๋ค. | |
| } | |
| public static void main(String[] args) throws IOException { | |
| BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
| StringTokenizer st; | |
| StringBuilder sb = new StringBuilder(); | |
| int T = Integer.parseInt(br.readLine()); | |
| while (T-- > 0) { | |
| map = new HashMap<>(); | |
| int F = Integer.parseInt(br.readLine()); | |
| int cnt = 0; | |
| // ํ ์์ ์น๊ตฌ F <= 100,000 ์ธ ๊ฒฝ์ฐ ์ต๋ 200,000๋ช ์ ์น๊ตฌ๊ฐ ํ์ํจ. | |
| parent = new int[200_001]; | |
| ans = new int[200_001]; | |
| for (int i = 0; i < 200_001; i++) { | |
| parent[i] = i; // ์์๋ ธ๋์ ๋ถ๋ชจ๋ ธ๋ ์ ๋ ฅ | |
| ans[i] = 1; // ์งํฉ์ ์ํ ์น๊ตฌ ์ ์ ๋ ฅ | |
| } | |
| for (int i = 0; i < F; i++) { | |
| st = new StringTokenizer(br.readLine()); | |
| String name1 = st.nextToken(); | |
| String name2 = st.nextToken(); | |
| // ํด์ฌ๋งต์ ์๋ ์น๊ตฌ๋ผ๋ฉด ์ ๋ ฅํ๊ณ value์ ๋ฒํธ ๋ถ์ฌ. | |
| if (!map.containsKey(name1)) { | |
| map.put(name1, cnt++); | |
| } | |
| if (!map.containsKey(name2)) { | |
| map.put(name2, cnt++); | |
| } | |
| // ์น๊ตฌ๋ณ ๋ฒํธ๋ก union ์ฐ์ฐํ๊ธฐ. | |
| union(map.get(name1), map.get(name2)); | |
| sb.append(ans[find(map.get(name1))]).append("\n"); | |
| } | |
| } | |
| System.out.print(sb); | |
| } | |
| } |
๐ฑ ๋๋ ์
์ ๋์จ ํ์ธ๋ ์์ฉ๋ฌธ์ ์๋ค. ์ค๋๋ง์ ๋ถ๋ฆฌ์งํฉ ๋ฌธ์ ๋ฅผ ํ์๋๋ฐ, ์ฌ์ค ์ ์ ํ๋ค๊ฐ ํฌ๊ธฐํ ๋ฌธ์ ์๋ค.
๊ทธ๋์ ๋ค๋ฅธ ์ ํ์ ๋ฌธ์ ๋ฅผ ํ๋ค ๋ณด๋ ํ ์ ์๊ฒ ๋์๋ค. ๊พธ์คํ ํ์ด๋ณด์
'Algorithm > - Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ] ๋ฐฑ์ค 1377 ๋ฒ๋ธ ์ํธ (JAVA) (1) | 2024.05.03 |
|---|---|
| [BOJ] ๋ฐฑ์ค 31782 ์ ์ฒด์จ์ฆ (JAVA) (0) | 2024.04.30 |
| [BOJ] ๋ฐฑ์ค 27211 ๋๋ ํ์ฑ (JAVA) (0) | 2024.04.10 |
| [BOJ] ๋ฐฑ์ค 17299 ์ค๋ฑํฐ์ (JAVA) (0) | 2024.04.01 |
| [BOJ] ๋ฐฑ์ค 1719 ํ๋ฐฐ (JAVA) (1) | 2024.03.21 |
๋๋ง์ ๊ฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค!
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!