프로그래머스 | 완주하지 못한 선수_Map 활용 코드 공부 편

imzzuu·2022년 5월 1일
0

저번 주 그룹스터디로 진행했던 완주하지 못한 선수에선 해시 개념을 적용하지 않고, 단순 배열을 이용해 문제를 풀었던 아쉬움이 있었다.
그래서 추가적으로, 해시 개념을 적용하여 Map 에 대해 공부 한 후 코드를 분석하며 개념을 다져보고자한다.

📃 완주하지 못한 선수


문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.
participantcompletionreturn
["leo", "kiki", "eden"]["eden", "kiki"]"leo"
["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"]"vinko"
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"]"mislav"

✏️ Map 풀이 분석하기


프로그래머스에서 본 코드

function solution(participant, completion) {
const myMap = new Map();

    for ( const participant of participants){
        if(!myMap.get(participant)){
            myMap.set(participant, 1);
        }else{
            myMap.set(participant, myMap.get(participant)+1);
        }
    }

    for(const completion of completions){
        if(myMap.get(completion)){
            myMap.set(completion, myMap.get(completion)-1);
        }
    }
    
    for(const participant of participants){
        if(myMap.get(participant) && myMap.get(participant) >=1 ){
            answer = participant;
        }
    }
    }

key로 이름을, value로 참가 인원수를 저장한다.

그리고, 완주자 배열을 반복시켜 value를 1씩 감소시킨다.

value가 1 이상이면 완주하지 못한 인원이므로 return 한다.

Map을 사용한 코드의 진행은 이렇다.
위의 코드를 console 로 찍어보며 분석해보았다.


코드 분석

function solution(participant, completion) {
		// map 생성
   const myMap = new Map() 
    
   for ( const par of participant){
       if(!myMap.get(par)){ /// 중복 이름을 걸러내기 (get(par)가 undefined 가 아니면?)
           myMap.set(par,1)  // 참가자의 이름을 key, 1을 값으로 저장
       } else {
           myMap.set(par, myMap.get(par)+1) /// 이미 par에 값이 있다면 값에 +1 해주기 
       }
       console.log(myMap)
    }
        for(const comp of completion){
        if(myMap.get(comp)){
            myMap.set(comp, myMap.get(comp)-1); // comp와 일치하는 key의 값은 -1 해주기
        }
        console.log(myMap)
    }
}

이렇게 코드를 작성했을 때, 테스트 3의 콘솔을 보면

  1. 첫 번째 for of (참가자)

    myMap 데이터에 참가자의 이름(par)key로, 1으로 추가해준다.
    ⇒ 참가자 모두 기본으로 1의 값을 갖게 되며, 중복의 경우 1씩 추가하여 값 저장

  2. 두 번째 for of (완주자)

    myMap 데이터에서 key(이름값)이면 값에서 1을 빼서 저장
    ⇒ 중복이 없는 경우(값 = 1), 완주를 했다면 값이 0이 됨

for(const par of participant){
if(myMap.get(participant) && myMap.get(participant) >=1 ){
answer = par;
	}
}

그 다음 (myMap 데이터를 key값을 이용해 길이만큼 돌면서) myMap 에 데이터가 있거나, 값(value)이 1보다 크거나 같으면 이름(key)을 return 한다.

0개의 댓글