코딩테스트 연습 - 완주하지 못한 선수
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수
programmers.co.kr
프로그래머스 완주하지 못한 선수
위 문제는 String 배열
participant / completion 을 제공받게 되는데
completion 배열은 participant 배열보다
size가 1 작기 때문에
participant 배열에서 completion 배열을
모두 빼준 뒤 남는 하나의 key 값을 반환하면 된다
문제를 푸는 방법은 다양하겠지만
시간제한이 존재하기 때문에
해시(Hash)를 사용해서 문제를 풀어줘야 한다
정답은 아래와 같은데
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
LinkedHashMap<String, Integer> participantMap = new LinkedHashMap<>();
LinkedHashMap<String, Integer> completionMap = new LinkedHashMap<>();
// completion을 이름 / 갯수로 변환
for(int i = 0; i < completion.length; i++) {
if(!completionMap.containsKey(completion[i])) { // Key 없을 경우(처음 삽입)
completionMap.put(completion[i], 1);
} else { // Key 존재할 경우
completionMap.put(completion[i], completionMap.get(completion[i]) + 1);
}
}
// participant을 이름 / 갯수로 변환
for(int i = 0; i < participant.length; i++) {
if(!participantMap.containsKey(participant[i])) { // Key 없을 경우(처음 삽입)
participantMap.put(participant[i], 1);
} else { // Key 존재할 경우
participantMap.put(participant[i], participantMap.get(participant[i]) + 1);
}
}
for(String key : participantMap.keySet()) { // participantMap 전체 조회
int temp = 0;
if(completionMap.containsKey(key)) { // completion에 존재할 경우 값 가져오기 이외는 0
temp = completionMap.get(key);
}
if(Objects.equals(participantMap.get(key) - temp, 1)) { // 두 배열 비교해서 1남는 값 찾기
answer = key;
break;
}
}
return answer;
}
}
문제 풀이방법을 한번 보자면
1. for 문을 돌리면서 Map에 두 배열을 넣어준다
for 문을 각각 배열 크기에 맞춰
completion / participant 두 배열을 돌려주면서
선언한 Map<String, Integer> 안에
Key(이름)와 Value(갯수)를 넣어준다
여기서 중복된 이름이 있기 때문에
containsKey() 메소드를 사용해서
이미 map에 넣어놨는데 동일한 이름이 있을 경우
기존 값에 +1을 해서 다시 put 시킨다
(Map은 동일한 Key로 put 시킬 경우
마지막에 put 한 값으로 Value 고정)
for 문을 배열 크기에 맞춰 돌려주면
Map 안에 이름 별 갯수를
넣어줄 수 있게 된다
2. 다시 한번 for 문을 돌리면서 배열 차이 계산
이제 이름과 갯수를 가진 Map 두개를 가지고 있으니
participantMap 크기에 맞게 for문을 돌려주면서
completion에 없는 값이 있을 수 있으므로
containsKey(값); 을 해서
NULL 일 경우에는 0으로 지정해주고
그 외에는 completionMap에 들어있는 갯수를 끌어와
participantMap의 이름별 갯수에서 빼주면 된다
그렇게 for 문을 돌리며 계산을 진행해 주다가
participant는 completion보다
무조건 1 더 크기 때문에
계산 후 0이 아닌 1이 떨어진다면
바로 for 문을 break 시키고
해당 1의 Key를 반환시켜주면 된다
'Language > 알고리즘 문제풀이' 카테고리의 다른 글
프로그래머스 순열 검사 자바 문제풀이 (0) | 2021.11.17 |
---|---|
프로그래머스 전화번호 목록 자바 문제풀이 (0) | 2021.10.29 |
프로그래머스 피보나치 수(Java) (0) | 2019.10.16 |
프로그래머스 짝지어 제거하기(Java) (0) | 2019.10.16 |
프로그래머스 N개의 최소공배수(Java) (0) | 2019.09.29 |
댓글