coding_test

[99클럽 4기 코테 스터디 TIL 11일차] 완주하지 못한 선수 (feat. HashMap)

jeri 2024. 11. 8. 02:14
반응형

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

1) 내가 구현한 코드

  • 처음에는 제시된 데이터가 둘 다 배열이니 배열끼리 비교하면 되겠다 생각했다.
  • 그러나 효율적이지 못할거라는 생각과, 동명이인은 어떻게 처리해야할지 모르겠다는 생각이 들었다.
  • 최종 내린 결론은 해시맵에 선수들의 이름을 키로 담고, 밸류에는 참가자들이면 카운드 1 더해주고, 또 완주했을경우 카운드 1을 더해주기로 한다. 이렇게 될 경우
  • 최종 완주한 선수들은 짝수 : 2, 4, 6, ... (2 이상은 동명이인)
  • 완주하지 못한 선수들은 홀수: 1, 3, 5, 7, ... (3 이상은 동명이인)
  • 으로 카운트 될 것이다. 밸류들 중 최종 홀수인 밸류의 키값을 반환하면 되는 것이다.
import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        //"name" : "호명횟수 2,4,6 .. 등 짝수"
        HashMap<String,Integer> map = new HashMap<>();
        
        for(String part:participant){
            map.put(part,map.getOrDefault(part,0)+1);
        }
               
        for(String comp:completion){
            map.put(comp,map.getOrDefault(comp,0)+1);
        }
        
        for(Map.Entry<String,Integer> entry:map.entrySet()){
            if(entry.getValue()%2==1) answer = entry.getKey();
        }
                
        return answer;
    }
}

 

 

2) 오늘의 학습 키워드

  • 배열의 빈도 수 계산
  • HashMap 활용한 참여자와 완주자 비교
  • 동명이인 처리 방식
  • 마라톤 참가자 중 완주하지 못한 한 사람을 찾는 문제를 해결했다.
  • 이 문제에서는 동명이인이 있을 수 있기 때문에 배열을 단순히 비교하는 것만으로는 답을 구할 수 없다.
  • 이에 따라 HashMap을 사용해 각 이름별 빈도 수를 저장하고,
    완주자 목록에서 이름을 차감하면서 최종적으로 남아 있는 이름을 찾는 방식으로 해결했다.

3) 오늘의 회고

문제점

  • 처음에는 HashMap 없이 단순히 두 배열을 비교하려 했으나, 동명이인이 포함된 경우와 배열의 크기가 크다는 점에서 어려움이 있었다.

해결법

  • HashMap을 활용하여 참가자의 이름을 Key로 설정하고, 참가자 목록을 순회하며 각 이름별로 빈도 수를 기록했다.
  • 이후 완주자 목록을 순회하면서 해당 이름의 빈도 수를 증감했다.
    • (차감해도 됨 : 이럴 경우 0이면 완주자, 1이면 완주하지 못한자).
  • 이는 O(n) 시간 복잡도로 문제를 효율적으로 해결할 수 있게 해주었다.

새롭게 알게된 점

  • HashMap을 이용해 중복된 이름을 효율적으로 관리하고,
  • 각 이름의 빈도 수를 카운트하는 방법을 배웠다.
  • 이 방식은 동명이인과 같은 케이스를 처리할 때 유용하다.

내일의 학습 목표

  • HashMap을 사용하는 빈도 수 처리 방식에서 다양한 예외 사항을 관리하는 방법을 학습할 예정이다.
  • 이를 통해 데이터를 집계하고 빈도 수를 더 복잡한 문제에도 응용할 수 있도록 연습할 계획이다.

 

4) 추가 문제

미들러 - Yes or yes

https://www.acmicpc.net/problem/25195

챌린저 - 도서관

https://www.acmicpc.net/problem/1461

반응형