[과제] 프로그래머스 lv.1 완주하지 못한 선수

miseullang·2024년 10월 27일

✅ 문제


문제 설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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"

입출력 예 설명

예제 #1

"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2

"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3

"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

프로그래머스 lv.1 완주하지 못한 선수

✅ 풀이


이번 문제는 수영님의 추천 문제였다.

문제에 해시 라는 키워드가 있는 걸 보면 요구하는 바가 있는 것 같은데 알고리즘을 모름 이슈로 그냥 논리만 정리해서 풀어보기로 했다.

처음에는 sort 를 사용해서 정렬한 다음 배열끼리 비교하면서 일치하는 값을 없애는 식으로 풀어보면 어떨까 고민했는데, 중복된 이름이 있을 수 있다고 해서 객체를 이용하는 방법으로 풀기로 했다.

바로 코드를 짜기는 어려운 문제라고 느껴져서 조건을 정리한 다음 한 줄씩 구현하는 방법으로 풀어봤는데… 스읍… 통과를 하긴 했는데

채점결과

정확성: 58.3

효율성: 41.7

합계: 100.0 / 100.0

정확성 이것 뭐예요…? 이건 다음에 다시 풀어봐야 할듯

// [ 조건 ]
// 완주를 못한 선수가 몇 명인지 X, 누구인지 O => 배열의 '값'을 리턴
// 선수 이름은 중복될 수 있다

// 1. 참여 명단 participant를 객체로 만든다
// => 중복값이 있으면 해당 키의 값을 + 1
// 2. 만들어진 객체의 키와 완주자 명단 completion의 값을 비교
// 2-1. 일치하는 키가 있으면 배열에서 제거하고 객체의 값을 -1
// 3. 1 객체의 프로퍼티 중 값이 0이 아닌 키를 answer로 반환

function solution(participant, completion) {
  const participantObj = {};

  for (let i = 0; i < participant.length; i++) {
    participantObj[participant[i]] = participantObj[participant[i]] ? participantObj[participant[i]] + 1 : 1;
  }

  for (let i = 0; i < completion.length; i++) {
    participantObj[completion[i]] = participantObj[completion[i]] - 1;
  }

  for (let key in participantObj) {
    if (participantObj[key] > 0) {
      return key;
    }
  }
}

console.log(solution(["leo", "kiki", "eden"], ["eden", "kiki"])); // "leo"
console.log(solution(
    ["marina", "josipa", "nikola", "vinko", "filipa"],
    ["josipa", "filipa", "marina", "nikola"]
)); // "vinko"
console.log(solution(["mislav", "stanko", "mislav", "ana"], ["stanko", "ana", "mislav"])); // "mislav"

✅ 다른 사람 풀이


이게 처음에 내가 풀려고 했던 방식과 비슷한 것 풀이인 것 같다.

문제에서 완주를 못 한 사람은 단 한 명이라고 명시했기 때문에 접근 가능한 방법이다.

굉장히 간단하고 깔끔해보임…!

const solution = (p, c) => {
    p.sort()
    c.sort()
    while (p.length) {
        let pp = p.pop()
        if (pp !== c.pop()) return pp
    }
}

정규표현식을 사용한 버전

var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))
profile
괴발개발 💻

0개의 댓글