๋ฌธ์ ๋งํฌ: https://school.programmers.co.kr/learn/courses/30/lessons/150366
ํ์ด
์ฒ์์๋ ์ฌ์ฉ์ ์ ์ ํด๋์ค๋ฅผ ์ด์ฉํด ํ์๋๋ฐ, ๊ฐ์ด ๋๋ฆฌ๊ฐ ๋์ ์์ ์๋ฃํ์ ์ด์ฉํด ํ์๋ค.
๋ณํฉ๊ณผ ๋ถํ ์ด๋ผ๋ ํค์๋๋ฅผ ๋ณด๊ณ , ์ ๋์จ ํ์ธ๋๋ฅผ ๋ ์ฌ๋ ธ๋ค.
๋ฐฐ์ด ์ ์ธํ๊ธฐ
static int N = 50;
String[] table = new String[N*N+1];
int[] parent = new int[N*N+1];
๊ฐ ์
์ ์์ ์ ๊ฐ๊ณผ, ๋ถ๋ชจ ๋
ธ๋์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํด์ผ ํ๋ค.
๋ฐ๋ผ์ ๊ฐ์ ์ ์ฅํ String ๋ฐฐ์ด๊ณผ, ๋ณํฉ๋ ์
์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๋ intํ ๋ฐฐ์ด์ ์ ์ธํด์ฃผ์๋ค.
ํ์ ํฌ๊ธฐ๊ฐ 50x50์ผ๋ก ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก ๋ฐฐ์ด์ ๊ธธ์ด๋ 50*50+1 = 2501๋ก ์ค์ ํ๋ค.
์ธ๋ฑ์ค ๋ณํ ํจ์
int getIdx(int r, int c) {
return (r-1)*N + c;
}
// r = idx/N + 1
// c = idx%N
๋งจ ์์ค๋ถํฐ 1, 2, 3, ... , 2500์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๋ฏ๋ก ํ๊ณผ ์ด์ ์ธ๋ฑ์ค๋ก ๋ณํํด์ฃผ๋ ํจ์๋ฅผ ์ ์ธํ๋ค.
UPDATE
void updateCell(int r, int c, String value) {
int rootIdx = find(getIdx(r, c));
table[rootIdx] = value;
}
void updateValue(String value, String updatedValue) {
for (int i=1; i<=N*N; i++) {
if(table[i]!=null && table[i].equals(value)) {
table[i] = updatedValue;
}
}
}
์ด์ ๋ฌธ์ ์์ ์๊ตฌํ๋ ๊ธฐ๋ฅ๋ค์ ํ๋์ฉ ๊ตฌํํด์ฃผ๋ฉด ๋๋ค.
์
์ ๊ฐ์๊ฐ ๊ทธ๋ ๊ฒ ๋ง์ง ์์ผ๋ฏ๋ก updateValue()
์์๋ ๋ฐ๋ก ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ง ์๊ณ , ์ ์ฒด ํ์์ ์ด์ฉํ๋ค.
MERGE
void merge(int r1, int c1, int r2, int c2) {
int x = find(getIdx(r1, c1));
int y = find(getIdx(r2, c2));
// (r1, c1)๊ณผ (r2, c2)๊ฐ ๊ฐ์ ์
์ธ ๊ฒฝ์ฐ ๋ฌด์
if(x==y) return;
String value = table[x];
if(table[x] == null) {
value = table[y];
}
table[x] = null;
table[y] = null;
union(x, y);
// ๋ฃจํธ ์
์๋ง ๊ฐ ์
๋ ฅ
if(find(x) == x) {
table[x] = value;
table[y] = null;
}
else {
table[x] = null;
table[y] = value;
}
}
(r2, c2)์ ๊ฐ์ผ๋ก ๋ฎ์ด์์ฐ๋ ๊ฒฝ์ฐ๋ (r1, c1)์ด ๋น ์
์ธ ๊ฒฝ์ฐ๋ฐ์ ์์์ ์ฃผ์ํ์.
์ฌ๋ฌ ์
์ด ๋ณํฉ๋ ๊ฒฝ์ฐ, ๋ฃจํธ ์
์๋ง ๊ฐ์ ๋ฃ์ด์ฃผ๊ธฐ ์ํด์ ์์ ์
์ ๊ฐ์ ์ ๋ถ null
๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
UNMERGE
void unmerge(int r, int c) {
int root = find(getIdx(r, c));
String value = table[root];
List<Integer> unmergeCells = new ArrayList<>();
for (int i=1; i<=N*N; i++) {
if(find(i) == root) {
unmergeCells.add(i);
}
}
for (int cell : unmergeCells) {
parent[cell] = cell;
table[cell] = null;
}
int idx = getIdx(r, c);
table[idx] = value;
}
UNMERGE์์ ์ฃผ์ํด์ผ ํ ์ ์, ์ ์ ๋ฐ๋ก ๋ถํ ํด๋ฒ๋ฆฌ๋ฉด ์ ๊ฐ์ ์ฐ๊ฒฐ๊ด๊ณ๊ฐ ๋๊ฒจ์ ์ ๋ถํ ์ด ์ ๋๋ก ์งํ๋์ง ์๋๋ค๋ ์ ์ด๋ค.
์๋ฅผ ๋ค์ด 1, 5, 20, 28 ์ด ๋ค๊ฐ์ ์
์ด ๋ณํฉ๋ ์ํ๋ผ๊ณ ํ์ ๋, ๋ฃจํธ ์
์ 1๋ฒ ์
์ด ๋๋ค.
๊ทธ๋ฐ๋ฐ 5๋ฒ ์
์ ๋ฐ๋ก ๋ถํ ํด๋ฒ๋ฆฌ๋ฉด, parent[5] = 5
๊ฐ ๋์ด, find(20)
์ ํ์ ๋ 5
๊ฐ ๋์ค๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ด๋ค ์ ์ด ๋ถํ ๋์์ธ์ง ์ ๋ถ ํ์ธํ ๋ค์ ๋ถํ ์ ์งํํด์ผ ํ๋ค.
String print(int r, int c) {
int root = find(getIdx(r, c));
String value = table[root];
if(value==null) return "EMPTY";
else return value;
}
PRINT๋ ๊ฐ๋จํ๋ค. ์
์ ๊ฐ์ด null
์ด๋ฉด EMPTY๋ฅผ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ์ ๋ฐํํด์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๋ฐํ๋ ๊ฐ์ ๋ฆฌ์คํธ์ ๋ด์, ๋ง์ง๋ง์ ๋ฐฐ์ด๋ก ๋ณํํ์ฌ ๋ฆฌํดํ๋ค.
์ ์ฒด ์ฝ๋
import java.util.*;
class Solution {
static int N = 50;
String[] table = new String[N*N+1];
int[] parent = new int[N*N+1];
public String[] solution(String[] commands) {
List<String> answer = new ArrayList<>();
for (int i=1; i<=N; i++) {
for (int j=1; j<=N; j++) {
int idx = getIdx(i, j);
parent[idx] = idx;
}
}
for (int i=0; i<commands.length; i++) {
String[] command = commands[i].split(" ");
if(command[0].equals("UPDATE") && command.length==3) {
updateValue(command[1], command[2]);
} else if(command[0].equals("MERGE")) {
int r1 = Integer.parseInt(command[1]);
int c1 = Integer.parseInt(command[2]);
int r2 = Integer.parseInt(command[3]);
int c2 = Integer.parseInt(command[4]);
merge(r1, c1, r2, c2);
} else {
int r = Integer.parseInt(command[1]);
int c = Integer.parseInt(command[2]);
if(command[0].equals("UPDATE")) {
updateCell(r, c, command[3]);
} else if (command[0].equals("UNMERGE")) {
unmerge(r, c);
} else {
answer.add(print(r, c));
}
}
}
return answer.toArray(new String[answer.size()]);
}
int getIdx(int r, int c) {
return (r-1)*N + c;
}
int find(int x) {
int root = parent[x];
if(root == x) return x;
return parent[x] = find(parent[x]);
}
void updateCell(int r, int c, String value) {
int rootIdx = find(getIdx(r, c));
table[rootIdx] = value;
}
void updateValue(String value, String updatedValue) {
for (int i=1; i<=N*N; i++) {
if(table[i]!=null && table[i].equals(value)) {
table[i] = updatedValue;
}
}
}
void union (int x, int y) {
x = find(x);
y = find(y);
if(y < x) parent[x] = y;
else parent[y] = x;
}
void merge(int r1, int c1, int r2, int c2) {
int x = find(getIdx(r1, c1));
int y = find(getIdx(r2, c2));
if(x==y) return;
String value = table[x];
if(table[x] == null) {
value = table[y];
}
table[x] = null;
table[y] = null;
union(x, y);
if(find(x) == x) {
table[x] = value;
table[y] = null;
}
else {
table[x] = null;
table[y] = value;
}
}
void unmerge(int r, int c) {
int root = find(getIdx(r, c));
String value = table[root];
List<Integer> unmergeCells = new ArrayList<>();
for (int i=1; i<=N*N; i++) {
if(find(i) == root) {
unmergeCells.add(i);
}
}
for (int cell : unmergeCells) {
parent[cell] = cell;
table[cell] = null;
}
int idx = getIdx(r, c);
table[idx] = value;
}
String print(int r, int c) {
int root = find(getIdx(r, c));
String value = table[root];
if(value==null) return "EMPTY";
else return value;
}
}
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ฒฝ์ฌ๋ก์ ๊ฐ์ (0) | 2023.11.12 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฑ์ฐ์ฝ์ค ์ ํ๊ธฐ (1) | 2023.11.08 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์๊ณผ ๋๋ (0) | 2023.09.07 |
[๋ฐฑ์ค 5052] ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2023.09.04 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์์ด์ปจ (0) | 2023.09.04 |