해시 맵 자료구조 풀이#1

성찬홍·2024년 8월 19일

자료구조

목록 보기
9/29
post-thumbnail

해시 맵 문제풀이 (프로그래머스: 완주하지 못한 선수 )

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

문제 설명

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

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

제한사항

마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의


첫 번째 풀이

  • 완주자를 반복문을 이용해서 key,value 형태로 그대로 저장
  • 참여자를 이용해서 key를 찾아 undefined가 나오면 , 완주하지 못한 사람으로 결과 도출하기

function solution(participant, completion) {
  var answer = "";

  let map = new Map();
  // 완주자를 반복문을 이용해서 key,value 형태로 그대로 저장
  for (let i = 0; i < completion.length; i++) {
    map.set(completion[i], completion[i]);
  }

  // 참여자를 이용해서 key를 찾아 undefined가 나오면 , 완주하지 못한 사람으로 결과 도출하기
  for (let i = 0; i < participant.length; i++) {
    if (!map.get(participant[i])) {
      answer = participant[i];
      break;
    } else {
    }
  }
  console.log("answer", answer);

  return answer;
}

=> 문제 발생

  • 키 값은 중복될 수 없어서, 동명이인을 걸러내지 못하는 문제가 생겼다.

개선한 풀이

  • key 값은 주자 이름으로 하되, value를 카운팅하는 방법으로 변경
  • 참여자를 반복문 돌려서 이름이 없거나 0인 value가 나오면 결과 도출하는 것으로 해결
function solution2(participant, completion) {
  var answer = "";
  let map = new Map();

  for (let i = 0; i < completion.length; i++) {
    let name = completion[i];
    // 해당 이름으로 키값이 이미 존재하면 +1
    if (map.has(name)) {
      map.set(name, map.get(name) + 1);
    }
    // 해당 키값이 처음 나왔으면 1로 저장
    else {
      map.set(name, 1);
    }
  }

  for (let i = 0; i < participant.length; i++) {
    let name = participant[i];
    // map에 해당 이름이 없거나, 개수가 0이면 완주 못한 사람
    if (!map.has(name) || map.get(name) === 0) {
      answer = name;
      break;
    } else {
      map.set(name, map.get(name) - 1);
    }
  }
  return answer;
}

느낀점

  • 예전에 해시 맵의 개념을 모를 떄 무작정 배열로 풀어본 적이 있었는데, 그 떄 시간 에러가 났었던 것 같다.
  • 이번에 해시 맵에 대한 이해를 가지고 문제를 보니 접근방법이 조금 보였던 것 같습니다.
  • 단계별로 좀 더 어려운 문제도 풀어보면 해시 맵에 대해 이해가도가 잘 될 것 같습니다.
profile
꾸준한 개발자

0개의 댓글