반응형
1. 문제
코딩테스트 연습 - 표 병합 | 프로그래머스 스쿨 (programmers.co.kr)
2. 팩트추출
Fact 1 : merge 커맨드와 unmerge 커맨드 보자마자 union-find 자료구조를 사용하면 된다는 것을 직감적으로 알 수 있다.
update 커맨드로 부모를 찾아 (집합 우두머리) 변경하고 merge, unmerge 커맨드로 부모 변수를 조정하면 끝이다.
3. 문제전략
union-find 자료구조!
4. 소스코드
class Solution {
public int[] parent = new int[2501];
public String[] value = new String[2501];
//UNION-FIND 알고리즘
public int find(int a) {
if (parent[a] == a)
return a;
else
return parent[a] = find(parent[a]);
}
public void union(int a, int b) {
a = find(a);
b = find(b);
if (a != b)
parent[b] = a;
}
//좌표를 번호로 변환
public int convertNum(int x, int y) {
int result = 50 * (x - 1);
return result + y;
}
public String[] solution(String[] commands) {
//초기화
for (int i = 1; i <= 2500; i++) {
parent[i] = i;
value[i] = "";
}
//명령어 실행
List<String> result = new ArrayList<>();
for (int ind = 0; ind < commands.length; ind++) {
String line = commands[ind];
StringTokenizer st = new StringTokenizer(line);
String command = st.nextToken();
if ("UPDATE".equals(command)) {
//UPDATE value1 value2
if (st.countTokens() == 2) {
String before = st.nextToken();
String after = st.nextToken();
for (int i = 1; i <= 2500; i++) {
if (before.equals(value[i]))
value[i] = after;
}
}
//UPDATE x y value
else {
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
String after = st.nextToken();
int num = convertNum(x, y);
value[find(num)] = after;
}
} else if ("MERGE".equals(command)) {
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
int n1 = convertNum(x1, y1);
int n2 = convertNum(x2, y2);
int root1 = find(n1);
int root2 = find(n2);
//0. 같은 그룹이면 무시
if (root1 == root2) continue;
//1. 값을 가진쪽으로 병합
String rootString = value[root1].isBlank() ? value[root2] : value[root1];
value[root1] = "";
value[root2] = "";
union(root1, root2);
value[root1] = rootString;
} else if ("UNMERGE".equals(command)) {
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int num = convertNum(x, y);
int root = find(num);
String rootString = value[root];
value[root] = "";
value[num] = rootString;
List<Integer> deleteList = new ArrayList<>();
for (int i = 1; i <= 2500; i++) {
if (find(i) == root)
deleteList.add(i);
}
for (Integer t : deleteList)
parent[t] = t;
} else if ("PRINT".equals(command)) {
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int num = convertNum(x, y);
int root = find(num);
if (value[root].isBlank())
result.add("EMPTY");
else
result.add(value[root]);
}
}
return result.toArray(new String[0]);
}
}
반응형
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] 미로 탈출 명령어 (JAVA) (1) | 2023.02.25 |
---|---|
[Programmers] 표현 가능한 이진트리 (Java) (0) | 2023.02.06 |
[Programmers] 풍선 터트리기 (Java) (0) | 2022.10.09 |
[Programmers] 다단계 칫솔 판매 (Java) (0) | 2022.10.08 |
[Spring] Dependency Lookup (DL) (1) | 2022.10.08 |