문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
두 개의 문자열 배열 list1과 list2가 주어졌을 때, 인덱스 합이 가장 작은 공통 문자열을 찾아라.
공통 문자열은 list1과 list2 모두에 나타난 문자열이다.
인덱스 합이 가장 작은 공통 문자열은 list1[i]와 list2[j]에 모두 나타났을 때, i + j가 다른 모든 공통 문자열 중에서 최소값이 되어야 하는 공통 문자열이다.
인덱스 합이 가장 작은 공통 문자열을 모두 반환해라. 순서는 상관없다.
#1
Input: list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"], list2 = ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
Output: ["Shogun"]
Explanation: 오직 공통된 문자열은 "Shogun"이다.
#2
Input: list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"], list2 = ["KFC", "Shogun", "Burger King"]
Output: ["Shogun"]
Explanation: 인덱스 합이 가장 작은 공통된 문자열은 인덱스 합이 sum = (0 + 1) = 1인 "Shogun"이다.
#3
Input: list1 = ["happy", "sad", "good"], list2 = ["sad", "happy", "good"]
Output: ["sad", "happy"]
Explanation: 공통된 문자열은 세 개가 있다.
"happy"의 인덱스 합은 sum = (0 + 1) = 1이다.
"sad"의 인덱스 합은 sum = (1 + 0) = 1이다.
"good"의 인덱스 합은 sum = (2 + 2) = 4이다.
인덱스 합이 가장 작은 공통된 문자열은 "sad"와 "happy"이다.
class Solution {
public String[] findRestaurant(String[] list1, String[] list2) {
Map<String, Integer> map = new HashMap<>();
List<String> result = new ArrayList<>();
int sum = Integer.MAX_VALUE;
for(int i = 0; i < list1.length; i++){
map.put(list1[i], i);
}
for(int i = 0; i < list2.length; i++){
Integer j = map.get(list2[i]);
if(j != null && i + j <= sum){
if(i + j < sum){
result.clear();
sum = i + j;
}
result.add(list2[i]);
}
}
return result.toArray(new String[result.size()]);
}
}