공부/코딩테스트

프로그래머스 완주하지 못한 선수

데자와 맛있다 2022. 11. 13. 02:25

-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";
    }
}