Java 프로그래밍에서 두 개의 문자열을 비교하여 한쪽에만 존재하는 고유한(uncommon) 문자들을 추출한 뒤, 이를 하나의 문자열로 연결해야 하는 경우가 있습니다. 아래 예제에서는 HashMap을 활용해 이 문제를 효율적으로 해결하는 방법을 살펴보겠습니다.
예제 코드
import java.util.*;
import java.lang.*;
import java.io.*;
public class Demo{
public static String concat_str(String str_1, String str_2){
String result = "";
int i;
HashMap<Character, Integer> my_map = new HashMap<Character, Integer>();
for (i = 0; i < str_2.length(); i++)
my_map.put(str_2.charAt(i), 1);
for (i = 0; i < str_1.length(); i++)
if (!my_map.containsKey(str_1.charAt(i)))
result += str_1.charAt(i);
else
my_map.put(str_1.charAt(i), 2);
for (i = 0; i < str_2.length(); i++)
if (my_map.get(str_2.charAt(i)) == 1)
result += str_2.charAt(i);
return result;
}
public static void main(String[] args){
String my_str_1 = "ABMCD";
String my_str_2 = "MNCPQR";
System.out.println("The uncommon values concatenated from both strings is : ");
System.out.println(concat_str(my_str_1, my_str_2));
}
}
출력 결과
The uncommon values concatenated from both strings is :
ABDNPQR
코드 동작 원리
Demo 클래스에는 두 개의 문자열을 매개변수로 받는 concat_str 메서드가 정의되어 있습니다. 이 메서드는 다음과 같은 단계로 동작합니다.
1단계: HashMap 초기화
먼저 Character를 키로, Integer를 값으로 가지는 HashMap 인스턴스(my_map)를 생성합니다. 이후 두 번째 문자열(str_2)을 순회하면서 모든 문자를 키로 저장하고 값을 1로 설정합니다.
2단계: 첫 번째 문자열 처리
첫 번째 문자열(str_1)을 순회하면서 현재 문자가 my_map에 존재하지 않으면 결과 문자열(result)에 추가하고, 이미 존재한다면 해당 문자의 값을 2로 갱신합니다. 값이 2로 변경된 문자는 두 문자열에 모두 등장하는 공통 문자임을 의미합니다.
3단계: 두 번째 문자열 처리
마지막으로 두 번째 문자열(str_2)을 다시 순회하면서 값이 여전히 1인 문자, 즉 첫 번째 문자열에는 등장하지 않은 문자만 결과 문자열에 추가합니다. 이렇게 완성된 문자열이 최종적으로 반환됩니다.
main 메서드의 실행 흐름
main 메서드에서는 ABMCD와 MNCPQR이라는 두 개의 문자열을 정의한 뒤 concat_str 메서드를 호출합니다. 두 문자열에 공통으로 포함된 문자 M과 C는 제외되고, 나머지 문자들이 연결되어 최종적으로 ABDNPQR이 콘솔에 출력됩니다.
참고: 성능 개선 팁
위 코드에서는 문자열 연결에 += 연산자를 사용하는데, 반복 횟수가 많아지면 새로운 String 객체가 계속 생성되어 성능이 저하될 수 있습니다. 실무 환경에서는 StringBuilder를 사용해 문자열을 조립하는 것이 더 효율적입니다. 또한 HashMap 대신 boolean 배열이나 HashSet을 활용하면 코드를 더욱 간결하게 만들 수도 있습니다.