Programmers
Programmers LV.1 완주하지 못한 선수
Developer Garam.Choi
2020. 12. 16. 19:27
이번 코딩테스트를 공부하면서,
차근차근 보자는 생각으로 진행하였다,
해당 문제는 Hash 를 가지고 해결하라는 문구가 써있었지만,
원래 하던 개발 방식적으로 우선적으로 접근해보기로 하였다.
List<String>으로 constains를 이용하여 존재여부를 통하여 처리 할 수 있도록 진행하려 하였으나,
효율성 면에서 부족하단 평가를 받았다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
List<String> completPeopleList = new ArrayList<String>();
List<String> participantPeopleList = new ArrayList<String>();
for(String completPeople : completion) {
completPeopleList.add(completPeople);
}
for(String participantPeople : participant) {
if(completPeopleList.contains(participantPeople)) {
if(participantPeopleList.contains(participantPeople)){
answer = participantPeople;
}else{
participantPeopleList.add(participantPeople);
}
}else{
answer = participantPeople;
}
}
return answer;
}
}
위와 같이 코드 개발을 진행 한 후
Hash 만을 사용하여 진행하기 위하여 자료구조 기초를 다시한번 흩은 뒤 확인하다보니
사내는 현재 JDK 1.7을 쓰고 있는데, JDK 1.8에 getOrDefault 가 존재하는것을 알았고, 조금 더 코드가 줄어 들어 분리해야할 내역이 주는것을 확인하였다,
이를통하여 아래와 같이 간단하게 Hash를 사용하여 통과 완료 하였다.
participant가 여러명있을 경우, map에서 가져와 value + 1 을 진행함
-> 같은 동명이인이 있을 경우 동명이인의 수만큼 value가 증가
completion 리스트 인원에 participant 인원이 있을 경우, value -1 씩 차감
최종적으로 map key set으로 돌리면서 0이 아닌 인원이 통과 하지 못한것을 도출해낼 수 있음
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
Map<String,Integer> completionPeopleList = new HashMap<String, Integer>();
for(String participantPeople : participant) completionPeopleList.put(participantPeople ,completionPeopleList.getOrDefault(participantPeople,0) + 1);
for(String completPeople : completion) completionPeopleList.put(completPeople ,completionPeopleList.get(completPeople) - 1);
for(String key : completionPeopleList.keySet()){
if(completionPeopleList.get(key) != 0) answer = key;
}
return answer;
}
}