[프로그래머스] 완주하지 못한 선수 (C++)

호이·2021년 11월 18일
post-thumbnail

요약

참가자와 완주한 참가자의 이름이 담긴 배열이 주어질 때, 완주하지 못한 단 한 명의 참가자 이름를 반환

풀이

내 풀이

#include <string>
#include <vector>
#include <map>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
  map<string, int> m;
  for (string name : completion) {
    m[name]++;
  }
  for (string name : participant) {
    if (m.find(name) != m.end()) {
      m[name]--;
      if (m[name] == 0) {
        m.erase(name);
      }
    } else {
      return name;
    }
  }
  return 0;
}

배울 점

if(participant[i] != completion[i])
            return participant[i];
  • 위의 풀이처럼 주어진 두 개의 배열을 정렬 후 비교하면 간단히 풀 수 있다. 두 배열의 길이가 1 차이난다는 전제조건이 있기 때문이다. 정렬하고, 다른 게 등장하는 즉시 반환하면 된다.

주절주절

  • 문제가 정렬로 풀면 간단히 풀린다는 게 정말 놀라웠다. 알고리즘은 이래서 재밌다... ㅠㅠ 미리 공부하고 적재적소에 활용하자!!!
  • 코드를 짜는 것 이외에 시간을 만족해야 하기 때문에 풀기 어려웠다. 다양한 방법으로 아무리 풀이를 떠올려봐도 수행 시간에서 걸렸다. 특히 아직 C++의 자료구조를 잘 몰라서 map을 사용할 생각도 없었는데, 혹시나 하고 찾아 사용해 보니 풀 수 있었다.
  • 알고리즘을 공부하니 비로소 자료구조의 중요성이 보이기 시작하는 것 같다. 알아나가야 할 영역이 참 많다. 즐기자!!
profile
매일 부활하는 개복치

0개의 댓글