프로그래머스 완주하지 못한 선수
-2022년 10월 첫째주 공부내용 옮겨 씀-
-주소:https://school.programmers.co.kr/learn/courses/30/lessons/42576
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
-문제
-마라톤을 했는데 한명빼고 다 완주함
-참가자 이름은 participant배열에 완주자 이름은 completion배열에
-완주 못한애 이름을 return
-completion길이는 항상 participant길이보다 1작다= 항상 1명만 완주 못함(뭐 서바이벌이라도 한거임?)
-동명이인을 고려하시오
-아이디어
완주자 해시맵을 둔다
key는 애들 이름, value는 숫자, 완주자 명단에서 이름 나오면 value뺀다
value가 1인것이 완주 못한사람임
만약 빼는 과정에서 해시맵에서 발견 못하면 바로 그 이름 리턴
-첫번째 코드
import java.util.HashMap;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String,Integer> participant_map=new HashMap<String,Integer>();
for(int i=0;i<participant.length;i++){
if(participant_map.containsKey(participant[i])){
participant_map.put(participant[i],participant_map.get(participant[i])+1);
}else{
participant_map.put(participant[i],1);
}
}
for(int j=0;j<completion.length;j++){
if(!participant_map.containsKey(completion[j])){
return completion[j];
}
else{
participant_map.put(completion[j],participant_map.get(completion[j])-1);
}
}
for(String key:participant_map.keySet()){
if(participant_map.get(key)==1){
return key;
}
}
return "no answer";
}
}
-두번째 코드: 다른사람 코드 참고함, getOrDefault 사용
-참고링크:https://junghn.tistory.com/entry/JAVA-Map-getOrDefault-이란-사용법-및-예제
[JAVA] Map - getOrDefault 이란? 사용법 및 예제
getOrDefault - 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드 사용 방법 getOrDefault(Object key, V DefaultValue) 매개 변수 : 이 메서드는 두 개의 매개 변수를 허용합니
junghn.tistory.com
찾는 키가 존재하면 키의 값을 반환하고 아니면 기본값을 반환하는 메서드
맵.getOrDefalut(찾는키, 없으면 반환할 값)
import java.util.HashMap;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String,Integer> participant_map=new HashMap<String,Integer>();
for(int i=0;i<participant.length;i++){
participant_map.put(participant[i],participant_map.getOrDefault(participant[i],0)+1);
}
for(int j=0;j<completion.length;j++){
if(!participant_map.containsKey(completion[j])){
return completion[j];
}
else{
participant_map.put(completion[j],participant_map.get(completion[j])-1);
}
}
for(String key:participant_map.keySet()){
if(participant_map.get(key)==1){
return key;
}
}
return "no answer";
}
}
-세번째 코드: 다른사람 코드 참고, entrySet사용, containsKey로 없을때 바로 이름 반환한것을 바꾸기로함
- containsKey로 없을때 바로 반환 안하는 이유
https://d2.naver.com/helloworld/831311
위 링크에서 보면 HashMap에 put을 하면 내부적으로 put할때 해시맵 안에 그 값이 있는지 찾고 put을 함.. 그래서 containsKey를 찾고 또 put해주면 두번 찾게되는거 - entrySet
https://developer-talk.tistory.com/393
해시 맵에서 key , value둘다 필요한 경우에 keySet을 쓰면 get할때마다 HashMap에 그 key있나 검색해야됨
entrySet을 사용하면 그 순번에 있는 key, value를 같이 가져오므로 value와 key를 모두 그냥 가져오니깐 value가 1이면 그냥 아까 가져왔던 key를 리턴, 그 key가 있는지 검색할 필요가 없음
import java.util.HashMap;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String,Integer> participant_map=new HashMap<String,Integer>();
for(int i=0;i<participant.length;i++){
participant_map.put(participant[i],participant_map.getOrDefault(participant[i],0)+1);
}
for(int j=0;j<completion.length;j++){
participant_map.put(completion[j],participant_map.get(completion[j])-1);
}
for(HashMap.Entry<String, Integer> entry:participant_map.entrySet()){
if(entry.getValue().equals(1)){
return entry.getKey();
}
}
return "no answer";
}
}