반응형
https://programmers.co.kr/learn/courses/30/lessons/42576
코딩테스트 연습 - 완주하지 못한 선수
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수
programmers.co.kr
풀이1
import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
/*
참고
participant.length = completion.length + 1
*/
Arrays.sort(participant); // 1. participant 배열을 오름차순으로 정렬
Arrays.sort(completion); // 2. completion 배열을 오름차순으로 정렬
// ==> 둘 다 오름차순으로 정렬했으므로 같은 인덱스에서 값이 다른 그 선수가 완주하지 못한 선수이다.
for(int i = 0; i < completion.length; i++){
// 3. completion 길이만큼 돌림 -> participant 길이만큼 돌리면 java.lang.ArrayIndexOutOfBoundsException 가 나므로 주의할 것!
if(!participant[i].equals(completion[i])){ // 4. 같은 인덱스에서 값이 다르다면
answer = participant[i]; // 그 선수가 완주하지 못한 선수이므로
break; // 반복을 멈춘다.
}
}
if(answer.isEmpty()){ // 5. 만약 answer이 비었다면 -> 반복을 completion 길이만큼 돌렸기 때문에 participant 배열의 맨 마지막 값이 정답이 된다.
answer = participant[participant.length - 1]; // 6. index는 0부터 시작하므로 participant.length - 1이 participant 배열의 맨 마지막 값이 된다.
}
return answer;
}
}
풀이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 player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
getOrDefault(key, DefaultValue)
찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환됩니다.
HashMap -> 동일 키 값을 추가할 경우 Value의 값이 덮어쓰기가 된다.
ex. hm.put("mislav", 1);
hm.put("mislav", 1);
==> hm.get("mislav");의 예상값 = 2
하지만 hm.get("mislav");의 값은 1이 반환된다.
-------------------------------------------------------------------------
! hm.put(player, hm.getOrDefault(player, 0) + 1) 처럼 + 1을 한 이유 !
==> HashMap이 동일 키 값을 추가할 경우 Value의 값이 덮어쓰기되는 현상이 발생하기 때문에!
ex. mislav 선수가 처음 나왔을 경우
처음 나왔으므로 mislav 라는 key의 value는 없으므로 디폴트 값인 0이 반환된다. 여기서
키키가 한 번 나왔음을 나타내주기 위해 디폴트 값인 0에서 1을 더해줘서 mislav key의 value는 1이 된다.
ex. mislav 선수가 두 번째 나왔을 경우
hm.get("mislav")을 할 경우 mislav key의 value는 1이 된다. 하지만 두 번 나왔기 때문에 이 값에서 + 1을 더해
mislav key의 value는 2가 되고 이 값을 HashMap에 저장한다.
=========================================================================================
for (String player : completion) hm.put(player, hm.get(player) - 1);
completion 배열에 대한 반복문을 돌리면서 해당 선수가 HashMap에 존재한다면 value를 -1 해준 값을 저장한다.
ex. completion 배열에 mislav 선수가 있는 경우
HashMap에서 "mislav"선수의 값을 조회한 결과 2가 나왔다. completion 배열에 mislav 선수가 존재하므로
HashMap에 있는 mislav 키값의 value를 -1하여 그 값(hm.put("mislav", 2-1)을 해시맵에 다시 저장한다.
*/
for (String key : hm.keySet()) { // keySet(): 전체 map의 key값만 출력하는 메소드
if (hm.get(key) != 0){ // 해당 키의 value를 조회했을 때 0이 아니라면 == completion 배열에 없던 선수
answer = key; // 답은 그 선수이다.
}
}
return answer;
}
}
728x90
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스 자바 JAVA] 문자열 내 마음대로 정렬하기 (level 1) (0) | 2022.03.18 |
---|---|
[프로그래머스 자바 JAVA] 폰켓몬 (level 1) (0) | 2022.03.18 |
[프로그래머스 자바 JAVA] 음양 더하기 (level 1) (0) | 2022.03.18 |
[프로그래머스 자바 JAVA] 숫자 문자열과 영단어 (level 1) (0) | 2022.03.18 |
[프로그래머스 자바 JAVA] 전화번호 목록 (level 2) (0) | 2022.03.15 |
댓글