-
[자바(JAVA)] 완주하지 못한 선수 /Arrays.sort(), equals(),HashMap, getOrDefault()카테고리 없음 2023. 6. 20. 14:26728x90
https://school.programmers.co.kr/learn/courses/30/lessons/42576
✅ 내 풀이
import java.util.Arrays; class Solution { public String solution(String[] participant, String[] completion) { String answer = ""; Arrays.sort(participant); Arrays.sort(completion); for(int i=0;i<completion.length; i++) { if(!completion[i].equals(participant[i])){ answer = participant[i]; break; } } if("".equals(answer)) { answer = participant[participant.length -1]; } return answer; } }
두 배열을 오름차순으로 정렬 후 인덱스별로 비교하여 값을 확인했다.
불일치가 나오면 그 인덱스의 participant[]값을 반환하고, 만약 완주하지 못한 사람이 가장 마지막 인덱스에 위치할 경우 answer = ""라서 마지막 인덱스를 반환한다.
이 코드를 작성하는데 상당한 시간이 걸렸고, 추후에 확인해보니 이 코드를 더 간단하게 줄이는 방법이 있었다.
✅ 다른풀이 (1)_ return문 적절히 활용하기
import java.util.*; class Solution { public String solution(String[] participant, String[] completion) { Arrays.sort(participant); Arrays.sort(completion); int i; for ( i=0; i<completion.length; i++){ if (!participant[i].equals(completion[i])){ return participant[i]; } } return participant[i]; } }
for문에서 만족하는 값을 바로 return 시키고 for문을 만족하지 않는, 즉 가장 마지막에 원하는 값이 있을 경우
이미 for문에서 전역변수 i++이 진행되었기 때문에 가장 마지막 인덱스를 반환하게 된다.
ex) completion.lengrh() = 3일때
for문은 총 3번 진행됨
i = 0이고 i++진행( 0 -> 1)
i = 1이고 i++진행( 1 -> 2)
i = 2이고 i++진행( 2 -> 3)
return participant[3];✅ 다른풀이 (2)
import java.util.HashMap; class Solution { public String solution(String[] participant, String[] completion) { String answer = ""; HashMap<String, Integer> hm = new HashMap<>(); for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1); for (String player : completion) hm.put(player, hm.get(player) - 1); for (String key : hm.keySet()) { if (hm.get(key) != 0){ answer = key; } } return answer; } }
HashMap 사용
1. HashMap<String, Integer> hm: 참가자의 이름과 개수를 저장하기 위한 해시 맵입니다
2. .hm.put(player, hm.getOrDefault(player, 0) + 1): participant 배열을 순회하면서 각 참가자의 이름을 키로 하고, 이미 존재하는 경우 해당 값에 1을 더하고, 존재하지 않는 경우 0을 반환하여 1을 더한 값을 저장합니다. 이를 통해 각 참가자의 이름과 개수가 hm에 저장됩니다
3. .hm.put(player, hm.get(player) - 1): completion 배열을 순회하면서 각 완주자의 이름을 키로 하고, 해당 값을 1씩 감소시킵니다. 이렇게 함으로써 완주자는 개수가 0이 되도록 처리됩니다.hm.keySet(): hm의 모든 키(참가자의 이름)를 가져옵니다
4. .hm.get(key): 특정 키에 해당하는 값을 가져옵니다.if (hm.get(key) != 0): 해당 참가자의 개수가 0이 아닌 경우, 즉 완주하지 못한 참가자인 경우입니다
5. .answer = key: 완주하지 못한 참가자의 이름을 answer에 할당합니다.즉, 처음에는 hm에 participant값을 key에 저장하고 getOrDefault를 이용하여 해당키에 값이 존재하면 그 값에 +1, 없을 경우 디폴드값인 0에 +1을 진행하게 된다.
중복일 경우 값이 2가 되며 아래의 -1을 수행하는 코드를 통해
중복값의 최종 value : 1
없는 값의 최종 value: 1
이렇게 된다.
728x90