문제
해결 방안 고민
- 단 한 명의 선수 제외하고는 모든 선수가 마라톤 완주
- 참가자 배열 participant, 완주한 선수 배열 completion
- 완주하지 못한 선수의 이름을 return
두 배열을 정렬해서 같지 않은 것을 추출
HashMap 순회
// 해시맵을 순회하면서 값이 0이 아닌 키(참가자 이름) 찾으면 됨
for (String key : hm.keySet()) {
if (hm.get(key) != 0) {
answer = key;
}
}
Markdown
복사
해결 방법
•
첫 번째 방법
◦
두 배열을 정렬한다.
◦
for 문을 통해 정렬된 두 배열을 앞에서부터 차례로 비교하여 다른 요소를 찾는다.
◦
완주하지 못한 선수가 단 한 명 존재하므로, 끝까지 비교했는데 다른 요소가 없다면 participant 배열의 마지막 요소가 완주하지 못한 선수가 된다.
•
두 번째 방법
◦
HashMap을 이용해 participant 배열의 각 이름의 등장 횟수를 카운팅한다.
◦
participant 배열을 순회하면서 해시맵에서 해당 이름의 등장 횟수를 하나씩 줄여나간다.
◦
HashMap에서 값이 0이 되지 않은 이름이 완주하지 못한 선수가 된다.
코드
•
배열 정렬 후 비교
package algo250305;
import java.util.*;
// 완주하지 못한 선수 - Lv1
public class Programmers42576 {
public String solution(String[] participant, String[] completion) {
String answer = "";
Arrays.sort(participant);
Arrays.sort(completion);
int length = completion.length;
for (int i = 0; i < length; i++) {
if (!participant[i].equals(completion[i])) { // 다른값인 경우
answer = participant[i];
return answer;
}
}
answer = participant[participant.length - 1]; // 각 요소의 값이 일치한 경우
return answer;
}
}
Java
복사
•
HashMap을 사용
package algo250305;
import java.util.HashMap;
// 완주하지 못한 선수_2 - Lv1
public class Programmers42576_2 {
public String solution(String[] participant, String[] completion) {
String answer = "";
// 해시맵 선언
HashMap<String, Integer> map = new HashMap<>();
// participant 배열 순회하면서 각 참가자의 이름 해시맵에 저장
for (String p : participant) {
map.put(p, map.getOrDefault(p, 0) + 1);
}
// completion 배열 순회하면서 각 완주자의 이름의 값을 해시맵에서 감소시킴
for (String c : completion) {
map.put(c, map.get(c) - 1);
}
// 해시맵을 순회하면서 값이 0이 아닌 키(참가자 이름) 찾으면 됨
for (String key : map.keySet()) {
if (map.get(key) != 0) {
answer = key;
}
}
return answer;
}
}
Java
복사