알고리즘/프로그래머스

[프로그래머스] lv1. 완주하지 못한 선수 [#해시] + HashMap 순회법

SHIN SANHA 2023. 10. 18. 20:35
반응형

 

 

 

 


1. 문제 출처


https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 


2. 설계


 

2중 for문 등으로 안풀려서 사람들 반응을 보았더니 효율성 따지기가 하늘의 별따기였던 문제이다.

나도 내 머리속으로 설계는 해시를 잘 몰라서 못했고, 사람들 의견을 보면서 진행해보았다.

 

1) 해시맵을 생성한다. <String, Integer>

2) 해시맵에 참여자를 넣어준다. 단, 동명이인이 있을 수 있으므로 Integer에는 사람의 수를 체크한다.

3) 해시맵에 완주자를 반영한다. 완주자 value 즉, Integer에 -1을 해준다.

4) 결과적으로 value가 1만 남은 참여자를 정답으로 리턴한다.

 

문제에서 미완주자는 무조건 1명이라 했기 때문에 가능한 설계이다.

 

 


3. 전체 코드


import java.util.HashMap;
import java.util.Map;
class Solution {
    //미완주자 명단
    //단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
    //동명이인은 서로 다른 사람이다.
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        HashMap<String, Integer> status = new HashMap<>();
    
        //참가자 상태 저장
        //containsKey 사용도 가능
        for(int i=0;i<participant.length;i++){
            status.put(participant[i],status.getOrDefault(participant[i],0)+1);
        }
        
        //완주자 상태 저장
        //replace도 사용가능
        for(int i=0;i<completion.length;i++){
            status.put(completion[i],status.get(completion[i])-1);
        }
        
        //1명이라도 남아있는 사람이 정답
        for(Map.Entry<String, Integer> set : status.entrySet()){
            if(set.getValue()==1){
                answer = set.getKey();
                break;
            }
        }
        
        
        return answer;
    }
}

 

배운점 : HashMap 순회 돌리기

import java.util.HashMap;
import java.util.Map;

HashMap<String, Integer> status = new HashMap<>();
for(Map.Entry<String, Integer> set : status.entrySet){
	if(set.getValue()==1){
    	//someting
        break;
    }
}

 

그저 외울뿐 ㅠ

참고로 forEach를 쓸 수도 있는데 어째선지 break이나 return은 안먹어서 안쓰기로 결정했다. (출력용)

map.forEach((key, value) -> {
    System.out.println(key + " : " + value);
});

 

 

value나 key만 돌리면 된다면 간단하게 아래처럼 할 수도 있다.

for (String key : map.keySet()) {
    String value = map.get(key);
    System.out.println(key + " : " + value);
}
반응형