※ 3번째 테스트에서 틀리다고 나옴 수정필요
핵심만 정리
마라톤에 참여한 선수들의 이름이 담긴 배열 participant
완주한 선수들의 이름이 담긴 배열 completion
완주하지 못한 선수들의 이름을 return하도록 solution 함수를 작성해라
입출력 예
["leo","kiki","eden"] / ["eden","kiki"] - > "leo"
["mislav","stanko","mislav","ana"] / ["stanko","ana","mislav"] - > "mislav"
두번째 입출력에서 mislav라는 String이 겹친다. 이걸 어떻게 해결해야하나..
처음에는 단순히 배열 정렬을 하고 이중for문으로 하나하나 살펴본 뒤 completion에 없는걸 추출하려고 했는데,
내가 할 수 있는건 하나하나 살펴보는것 뿐이었다. 배열 A에서 B에 존재하지 않는걸 추출하는 법을 모르겠다..
그래서 고민하고 있는데, 이 문제의 주제가 "해시" 였고
머릿속에서 떠오른 해시와 관련된건 HashMap 뿐이었기에 Key-Value값과 Key는 중복되지 않는 HashMap으로 접근했다.
중요한건 HashMap에서 Key는 중복되지 않기 때문에 입출력 두번째 예에서 mislav와 같이 중복된 이름이 있을 경우,
일단 중복을 피하고 싶었기 때문에 Key를 Integer, Value를 String으로 정했다.
그리고 적당히 HashMap의 메서드를 활용해서 풀어봤는데..
첫번째 두번째 테스트 케이스는 통과했으나 세번째 테스트 케이스인 이름이 중복된 경우는 통과하지 못했다.
내가 작성한건 단순히 정렬한 후 for문을 돌려서 key에 맞는 값들만 제거해서 마지막 value를 answer에 담는건데 중복된 value가 생기면 밀려서 아예 다른 값이 추출되는 결과가 나온다.
그렇다면 "key"를 이름으로 해야한다는 것인데, 이게 맞을까? 음.......
package 연습문제;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class hash01 {
public static void main(String[] args) {
String[] participant = {"leo","kiki","eden"};
String[] completion = {"eden","kiki"};
String answer = "";
Arrays.sort(participant);
Arrays.sort(completion);
Map<Integer,String> map1 = new HashMap<>();
for(int i=0; i<participant.length; i++) {
map1.put(i,participant[i]);
}
Map<Integer,String> map2 = new HashMap<>();
for(int i=0; i<completion.length; i++) {
map2.put(i,completion[i]);
}
// map1의 배열이 한칸 더 많으니까
// map1의 배열에서 map2만큼 싹 지워버리거나
// map1과 map2를 비교해서 남은 하나를 answer에 담으면 될 것 같은데..
for(int i=0; i<map1.size(); i++) {
if(map1.containsKey(map2)) {
map1.remove(i);
} else {
answer = map1.get(i);
}
}
System.out.println("answer : " + answer);
}
}
'코딩테스트' 카테고리의 다른 글
| 뉴스 클러스터링 (공부중) (4) | 2025.07.13 |
|---|---|
| 문자열 내 마음대로 정렬하기 (8) | 2025.07.13 |
| 구명보트 (0) | 2025.06.22 |
| 키패드 누르기 (0) | 2025.06.22 |
| 문자열 겹처쓰기 LV.0 (0) | 2025.06.08 |