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

연성·2021년 8월 28일
0

코딩테스트

목록 보기
215/261
post-thumbnail

[프로그래머스/C++] 호텔 방 배정

풀었던 문제를 다시 풀어보자!

1. 문제

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

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

2. 제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

3. 풀이

  • participant 배열에는 있지만 completion 배열에는 없는 원소를 찾으면 된다.
  • 비교를 위한 방법으로 정렬 후 비교를 했다
  • 개수가 하나 적은 것 외에 나머지 원소는 모두 같기 때문에 정렬 후 인덱스 순서대로 비교하면 된다.
  • 같은 인덱스일 때 다른 값이 나온다면 그게 정답이다.
if (completion[i] != participant[i]) {
            answer = participant[i];
        }

4. 처음 코드와 달라진 점

  • 같은 값을 찾으면 break 해야지 생각해놓고 다른 거 구현하다가 안해줬다.
  • 테스트 케이스에 해당 부분에 문제가 없어서 넘어갔다.
  • break를 안 해주면 뒤에 나올 값들은 같은 인덱스일 때 대부분(동명이인 때문에 같을 수도 있음) 다른 값이기 때문에 answer이 계속 갱신되어 오답을 return한다.

5. 코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    sort(participant.begin(), participant.end());
    sort(completion.begin(), completion.end());
    
    for(int i=0; i<completion.size(); ++i) {
        if (completion[i] != participant[i]) {
            answer = participant[i];
            break;
        }
    }
    
    if (answer == "") {
        answer = participant[participant.size()-1];
    }
    return answer;
}

6. 풀이 2

javaScript와 해시를 배우면서 정렬을 하지 않고 푸는 방법을 알게 되었다.

  • 완주한 선수의 이름을 key로 받아 저장한다.
    • 처음 등록되는 값이면 1로 등록하고
    • 이미 등록되어 있는 값이면 기존 value에 1을 더해준다.
  • 참가한 선수의 이름을 돌면서 해시와 비교한다.
    • 참가자 중 등록되어 있지 않거나 값이 0이면 해당 선수가 완주하지 못한 선수이다.
    • 해시에 등록된 키라면 값을 1 감소시켜준다.

7. 코드

function solution(participant, completion) {
    let answer = '';
    
    let hs = new Map();
    
    for (const x of completion) {
        hs.set(x, (hs.get(x) || 0 ) + 1);
    }
    
    for (const x of participant) {
        if (!hs.has(x) || hs.get(x) === 0) {
            answer = x;
            break;
        }
        hs.set(x, hs.get(x) - 1);
    }
    return answer;
}

0개의 댓글