1061 - Lexicographically Smallest Equivalent String
info
- 문제 보기: 1061 - Lexicographically Smallest Equivalent String
- 소요 시간: 26분 52초
- 풀이 언어:
java
- 체감 난이도: 2️⃣~3️⃣ (2.7)
- 리뷰 횟수: ✅
풀이 키워드
스포주의
유니온파인드
풀이 코드
info
- 메모리: 41850 KB
- 시간: 2 ms
class Solution {
int[] nxt;
public void union(int a, int b) {
int r1 = find(a);
int r2 = find(b);
if (r1 < r2) nxt[r2] = r1;
else if (r1 > r2) nxt[r1] = r2;
else return;
}
public int find(int n) {
if (n == nxt[n]) return n; // is root
int root = find(nxt[n]);
nxt[n] = root;
return root;
}
public String smallestEquivalentString(String s1, String s2, String baseStr) {
nxt = new int[26];
for (int i = 0; i < 26; ++i) nxt[i] = i;
// guarantee lex smallest by root value comparison
// ex. if r1 < r2 then nxt[r2] = r1
char[] s1Arr = s1.toCharArray();
char[] s2Arr = s2.toCharArray();
for (int i = 0; i < s1.length(); ++i) {
int a = s1Arr[i]-'a';
int b = s2Arr[i]-'a';
if (find(a) != find(b)) union(a, b);
}
StringBuilder sb = new StringBuilder();
for (char ch : baseStr.toCharArray()) {
sb.append((char)(find(ch-'a')+'a'));
}
return sb.toString();
}
}
풀이 해설
유니온파인드 알고리즘을 통해 문자를 집합으로 묶고, 각 집합 내 lexicographically smallest한 문자를 알아내서
baseStr을 해당 문자로 치환해야 하는 문제이다.
lex smallest는 union하는 과정으로부터 자연스럽게 도출되므로, 대놓고 유니온파인드 문제임을 알 수 있다.
(lex largest는 union 로직에서 if r1 < r2 then nxt[r1] = r2
처럼 condition을 조정하면 된다.)
🐳 Union-Find 이해하기
지난번 백준 1717번에서 그린 diagram은 약간 아쉬운 예시를 들었기에, 다시 설명해보겠다.