Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 인프런
- 그리디
- transaction
- AOP
- db
- kotlin
- 스프링 핵심 기능
- Greedy
- java
- SpringBoot
- Thymeleaf
- jpa
- JPQL
- 스프링
- Proxy
- Android
- Exception
- 김영한
- spring
- pointcut
- 자바
- Servlet
- 알고리즘
- 스프링 핵심 원리
- JDBC
- Spring Boot
- QueryDSL
- 백준
- springdatajpa
- http
Archives
- Today
- Total
개발자되기 프로젝트
[프로그래머스] 완주하지 못한 선수 본문
1. 문제
수많은 마라톤 선수들이 마라톤에 참여하였습니다.
단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
- 제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
- 입출력 예
participant | completion | return |
["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", "marina", "nikola"] | "vinko" |
["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
- 입출력 예 설명
- 예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다. - 예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다. - 예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에
한명은 완주하지 못했습니다.
- 예제 #1
2. 초기 아이디어
- 참여자의 이름이 완주자 명단에 있는경우 완주자 명단에서 삭제.
- 참여자의 이름이 완주자 명단에 없는 경우 해당 완주자 이름 return.
- 이렇게 되면 이름이 중복되어도 처리가 가능하다.
3. 구현
- 완주자 명단에서 참여자가 있는지 어떻게 찾을 것인지..?
- ArrayList의 contains() 활용
4. 코드
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
ArrayList<String> participants = new ArrayList<>(Arrays.asList(participant));
ArrayList<String> completions = new ArrayList<>(Arrays.asList(completion));
for (String p : participants) {
if (completions.contains(p)){
completions.remove(p);
}else {
return p;
}
}
return "";
}
}
5. 결과
- 되긴 하는데 효율성이 꽝이다.
6. 코드 개선
- 이 문제는 "해시"를 활용하는 것이다.
- "해시"를 활용하자.
- hashMap에 이름별 count를 집어넣자.
- key : 이름
- value : count 수 -> 동명 이인이면 count = 2
- 위의 방식과 유사하게 이번에는 참여자에서 완주자를 빼주자.
- 참여자 이름이 완주자 명단에 있는 경우 count를 1뺀다.
- 루프를 다 돌고 count가 여전히 1이상인 경우는 참여자 이름이 완주자 명단에 없다고 볼 수 있음.
- 동명 이인인 경우 완주자 명단에 두 번 나와야 하지만 한 번만 나오는 경우 count가 1이 됨.
- getOrDefault(key, defaultValue) : key에 해당하는 value가 있으면 가져오고 없으면 defaultValue 반환.
import java.util.HashMap;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> participants = new HashMap<>();
//중복이름 count
for (String player : participant) {
participants.put(player, participants.getOrDefault(player, 0)+1);
}
//참여자 명단에서, 완주 명단에 있는사람 count-1
for (String c : completion) {
if (participants.containsKey(c)){
Integer cnt = participants.get(c);
participants.put(c, cnt-1);
}
}
//참여자 명단에서 count가 1 이상인 경우 미완주자.
for (String p : participants.keySet()) {
if (participants.get(p) > 0){
answer = p;
}
}
return answer;
}
}
7. 결과
- 테스트 통과와 더불어 효율성도 증가되었다.
8. 정리
- HashMap의 장점??
- 자료를 찾는 시간이 빠르다.
- HashMap은 애초부터 검색을 위한 자료구조이다.
- key & value pair로 자료를 관리하기 때문에 key 에 해당하는 value를 찾는데 빠름.
- 반면 ArrayList는 선형 구조로 i 번 째 자료를 찾는데 최적화 되어있음.
- 즉 첫번째 코드의 경우 처음부터 순서대로 값을 비교하기 때문에 효율성이 떨어졌다고 할 수 있음.
- getOrDefault(key, defaultValue) : key에 해당하는 value가 있으면 가져오고 없으면 defaultValue 반환
- 즉 특정 data를 빠르게 찾아야 한다? -> HashMap을 사용하는걸 고려하자.
9. GitHub : coding_test
'코테준비' 카테고리의 다른 글
[프로그래머스] 다리를 지나는 트럭 (0) | 2021.11.29 |
---|---|
[프로그래머스] 프린터 (0) | 2021.11.27 |
[프로그래머스] 기능개발 (0) | 2021.11.27 |
[프로그래머스] 위장 (0) | 2021.11.27 |
[프로그래머스] 전화번호 목록 (0) | 2021.11.25 |
Comments