forked from GreatAlgorithm-Study/AlgorithmStudy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathYJ_150366.java
More file actions
132 lines (111 loc) · 3.84 KB
/
YJ_150366.java
File metadata and controls
132 lines (111 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import java.io.*;
import java.util.*;
public class YJ_150366 {
static final int MAX = 50*50;
static String[] table = new String[MAX+1];
static int[] parents = new int[MAX+1];
static List<String> prints = new ArrayList<>();
public String[] solution(String[] commands) throws IOException {
//자기자신으로 초기화
for(int i=0; i<MAX; i++){
parents[i] = i;
}
for(String command : commands){
StringTokenizer st = new StringTokenizer(command);
String message = st.nextToken();
switch(message){
case "UPDATE":
String data = st.nextToken();
//알파벳 소문자와 숫자
String data1 = st.nextToken();
if(st.hasMoreTokens()){
update(Integer.parseInt(data),
Integer.parseInt(data1),
st.nextToken());
}else{
update(data,data1);
}
break;
case "MERGE":
merge(Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()));
break;
case "UNMERGE":
unmerge(Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()));
break;
case "PRINT":
print(Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()));
break;
}//switch
}//for
return prints.toArray(new String[0]);
}
//UPDATE r,c,value
public void update(int r, int c, String value){
int parent = find(getIndex(r, c));
table[parent] = value;
}
//UPDATE value1 value2
public void update(String value1, String value2){
for(int i=0; i<MAX; i++){
int parent = find(i);
if(Objects.equals(value1,table[parent])){
table[parent] = value2;
}
}
}
//MERGE r1 c1 r2 c2
public void merge(int r1, int c1, int r2, int c2){
if(r1==r2 && c1 ==c2){
return;
}
union(getIndex(r1, c1), getIndex(r2, c2));
}
//UNMERGE r c
public void unmerge(int r, int c){
for(int i=0; i<MAX; i++){
find(i);
}
int index = getIndex(r, c); //표 인덱스
int parent = parents[index]; //병합된 부모찾기
String value = table[parent]; //부모의 value
for(int i=0; i<table.length; i++){
if(parents[i] == parent){
parents[i] = i; //부모에서 벗어나기
table[i] = null; //병합 해제 후 셀 초기화
}
}
table[index] = value;
}
//PRINT r c
public void print(int r, int c){
int parent = find(getIndex(r, c));
String result = Objects.isNull(table[parent])? "EMPTY" : table[parent];
prints.add(result);
}
//★병합된 셀 중 부모찾기
public int find(int num){
if(parents[num] == num){
return parents[num];
}
return parents[num] = find(parents[num]);
}
//셀 병합하기
public void union(int num1, int num2){
num1 = find(num1); //A
num2 = find(num2); //A
if(num1 == num2){ //이미 병합된 경우
return;
}
table[num1] = Objects.isNull(table[num1])? table[num2] : table[num1];
parents[num2] = num1;
table[num2] = null;
}
private int getIndex(int r, int c){
return (r-1)*50 + c-1;
}
}