PS (Problem Solving)/Programmers

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

캐럿노트 2022. 8. 7. 00:37

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

설계

- for문으로 확인 및 remove로 삭제해 남은 사람을 return 

- test case중 정확성 테스트는 모두 통과하였으나 효율성 테스트에서 모두 탈락하였다.

- Hash를 사용해야 하는 것을 배우고 코드를 다시 적용하여 제출 및 성공했다.

# 효율성 테스트를 통과하지 못한 코드

def solution(participant, completion):
    for person in completion:
        if person in participant:	# 도전자 명단에 완주자가 있다면 삭제
            participant.remove(person)
    answer = ''.join(participant)	# 미완주 도전자 : list -> 문자열로 변환
    return answer

 

python 풀이

# Hash Map을 활용한 풀이

def solution(participant, completion):
    hashMap = {}
    sumHashKey = 0

    for part in participant:
        hashMap[hash(part)] = part  # 도전자의 해쉬 맵을 생성한다.
        sumHashKey += hash(part)    # 해쉬키를 누적 더해준다.

    for comp in completion:
        sumHashKey -= hash(comp)    # 완주자의 해쉬 키들을 빼준다.

    return hashMap[sumHashKey]      # 1명이 완주하지 못했으므로 그 사람의 키값을 넣어준다.

 

javaScript 풀이

- completion의 배열 개수가 participant 보다 1개 적어서 for문으로 돌 경우 index error가 발생하지 않을까 걱정했지만 completion에서 index를 초과할 경우 undefined가 출력되어 결과적으로 error가 발생하지는 않는다.

function solution(participant, completion) {
  participant.sort()
  completion.sort()
  var answer = '';

  for (var i = 0; i < participant.length; i++) {
    if (participant[i] !== completion[i]) {
      answer = participant[i];
      break
    }
  } 
  return answer;
}

 

DevYoon님의 풀이(JavaScript)

- 나와는 다른 풀이 방법으로, 완주자가 1명 이상일 경우도 확인이 가능하다

- hash map에 하나씩 담고 완주한 사람들을 하나씩 뺀다

Blog :https://studyoon.tistory.com/

 

function solution(participant, completion) {
  var answer = "";
  let isComple = {};
  participant.map((word)=>{
      if(word in isComple){
          isComple[word] += 1
      }else{
          isComple[word] = 1
      }
  })
  completion.map((word)=>{
      isComple[word] -= 1
  })
  let keys = Object.keys(isComple)
  keys.map((word)=>{
      if(isComple[word] === 1){
          answer = word;
      }
  })
  return answer;
}