완주하지 못한 선수 링크
문제 설명:
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
입출력 예
participant | completion | return |
["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", "marina", "nikola"] | "vinko" |
["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
- B집합은 A집합의 부분집합이다.
- 전체 집합에는 동명이인이 있을 수 있다. (["mislav", "stanko", "mislav", "ana"],["stanko", "ana", "mislav"] )
문제 풀이:
- 참여 선수들을 Map<String, Integer> 로 저장한다.
- 해당 자료형으로 부터 B집합에 있는 선수들의 이름을 하나씩 제거한다.
- 남은 선수 한명을 return 한다.
public class IncompleteRunner {
public String solution(String[] a, String[] b) {
Map<String, Integer> map = new HashMap<>();
for (String s : a) map.put(s, map.getOrDefault(s, 0) + 1);
for (String s : b) {
map.put(s, map.get(s) - 1);
if (map.get(s) <= 0) map.remove(s);
}
return map.entrySet().iterator().next().getKey();
}
}
본 문제는 해시를 이용한 풀이를 의도했지만, 아래와 같이 간단한 풀이도 가능하다.
두 집합에서 한개의 요소씩 조회해가며 다른 요소가 발견됐을 시 return 하는 것이다.
public String solution(String[] a, String[] b) {
Arrays.sort(a);
Arrays.sort(b);
for (int i = 0; i < b.length; i++) {
if (!b[i].equals(a[i])) return a[i];
}
return a[a.length - 1];
}
위 문제에 대한 테스트코드는 아래와 같이 작성했다.
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.*;
class IncompleteRunnerTest {
private IncompleteRunner incompleteRunner;
@BeforeEach
void setUp() {
incompleteRunner = new IncompleteRunner();
}
@ParameterizedTest
@CsvSource({
"'leo,kiki,eden', 'eden,kiki'",
"'marina,josipa,nikola,vinko,filipa','josipa,filipa,marina,nikola'",
"'mislav,stanko,mislav,ana', 'stanko,ana,mislav'"
})
void solution(String a, String b) {
String[] participant = a.split(",");
String[] completion = b.split(",");
String result = incompleteRunner.solutionB(participant, completion);
System.out.println(result);
}
}
'Data Structures and Algorithms > Problems' 카테고리의 다른 글
LeetCode 42. Trapping Rain Water 빗물 트래핑 (0) | 2024.08.13 |
---|---|
LeetCode 23. Merge k Sorted Lists, k개 정렬 리스트 병합 (0) | 2024.08.11 |
LeetCode 3. Longest Substring Without Repeating Characters (0) | 2024.08.05 |
LeetCode 24. Swap Nodes in Pairs, 페어의 노드 스왑 (0) | 2024.08.04 |
LeetCode 15.3Sum (0) | 2024.07.28 |