
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 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" |
예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.
import java.util.HashMap;
public class PgHash1_4 {
public static void main(String[] args) {
String[] a = {"mislav", "stanko", "mislav", "ana"};
String[] b = {"stanko", "ana", "mislav"};
System.out.println(solution(a, b));
}
public static String solution(String[] participant, String[] completion) {
HashMap<String, Integer> hm = new HashMap<>();
String[] name;
for (String player : participant)
hm.put(player, hm.getOrDefault(player, 0) + 1);
for (String player : completion) {
hm.replace(player, hm.get(player) - 1);
if (hm.get(player) == 0) {
hm.remove(player);
}
}
name = hm.keySet().toArray(new String[0]);
return name[0];
}
}
import java.util.HashMap;
/**
* date: 21.05.31
*
*
* 1. input: 참여자 이름이 담긴 배열, 완주자 이름이 담긴 배열
* 2. output: 완주하지 못한 선수의 이름. 무조건 한명.
* 3. constraints:
* 1) 1 <= 마라톤 경기 참여한 선수의 수 <= 100,000
* 2) 완주자 배열의 길이 = 참여자 배열의 길이 - 1
* 3) 1 <= 참가자 이름 알파벳 개수 <= 20. 알파벳 소문자.
* 4) 동명이인 있을 수 있다. -> 이름 개수도 세기
* 4. edge cases: 1명이 참여할 경우 완주자는 없다.
* 5. brute force: 두 배열을 하나씩 비교한다.
* 시간복잡도: O(N*M), 공간복잡도: O(N+M)
* 6. optimal solution: 해시맵에 완주자의 이름과 이름의 개수를 넣고,
* 참가자의 이름이 해시맵에 존재하는지 본다. 존재한다면 개수를 1개 줄인다. 만약 개수가 0이 될 경우
* 해당 이름을 지운다.
* 참가자의 이름이 없을 경우 그 이름을 반환한다.
* 시간: O(participant.length=N), 공간: O(1)..?
* 7. code:
* */
public class Hash01 {
public static void main(String[] args) {
String[] participant = {"mislav", "stanko", "mislav", "ana"};
String[] completion = {"stanko", "ana", "mislav"};
System.out.println(solution(participant, completion));
}
public static String solution(String[] participant, String[] completion) {
String name = "";
HashMap<String, Integer> hm = new HashMap<>();
for (String player : completion) {
hm.put(player, hm.getOrDefault(player, 0) + 1);
}
for (String player : participant) {
if (hm.containsKey(player)) {
hm.replace(player, hm.get(player) - 1);
if (hm.get(player) == 0) hm.remove(player);
} else {
name = player;
}
}
return name;
}
}
자바와 알고리즘을 더 공부해야겠다! 😋
(21.04.09)
스터디를 하면서 처음으로 푼 문제이다. 전에 푼 문제지만 다른 방식으로 풀어보았다. 다른 팀원에게 해시맵을 사용하여 이 문제를 푸는 법을 하나씩 알려주면서 맵의 사용법을 알게 해 주었고, 나도 또한 맵을 정확한 목적과 사용법으로 이용해면서 공부할 수 있었다. 자바스크립트에서 맵을 사용하는 방법도 엿볼 수 있었다.
(21.06.05)