알고리즘 공부

[프로그래머스] 완주하기 못한 선수 - java

철매존 2021. 5. 1. 03:26
728x90
반응형

문제 설명

1. participant로 전체 참가자의 이름이 주어진다.

2. completion에서 완주한 참가자의 이름이 주어진다.

3. 완주한 참가자의 숫자는 전체 참가자의 수보다 1이 적다. 즉 한명은 절대 완주하지 못한다.

4. 동명이인이 있을 수 있다(한명이 통과하여도 다른 사람이 통과하지 못할 수 있다)

 

 

 

풀이 과정

1. 전체 참가자와 완주한 참가자는 결국 한명의 참가자를 제외하고는 동일한 이름들이 들어가 있을 것이다.

2. 즉, 참여는 하였는데 완주를 못한 참가자를 찾으면 된다.

3. 이름이 아니라 참가번호로 생각해 본다면

     참가자 : 1 2 3 4 5 6 7 

     완주자 : 1 2 3 5 6 7 

  이 경우, 4번 참가자는 완주하지 못한 것이다.

4. 그렇다면 두 배열을 정렬하고 처음부터 비교하면서, 둘이 서로 다른 경우 해당하는 전체 참가자의 번호가 정답이다.

5. 만약 모든 완주자의 수만큼 비교하였을 때, 끝까지 같은 경우는 마지막 참가자가 완주하지 못했을 것이다.

 

 

 

코드

gist.github.com/RyooChan/115fc51c1c463606c13dd9d83eacbea3.js"></script>

 


 

해당 문제는 내가 2021년 1월 25일에 풀었는데, 오늘 다시 문제를 보니 다른 방식이 하나 더 생각이 났다.

Hash를 통한 문제풀이를 그동안 여러 번 진행했는데, 그 중 getOrDefault라는 함수가 있다.

이를 사용한 풀이를 하나 더 적으려 한다.

 

 

풀이 과정(2)

1. getOrDefault를 사용하여 전체 참가자들을 구해준다.

2. getOrDefault는 key값의 중복을 판단하여 값을 하나씩 넣어주는 함수이다.

3. 따라서 모든 참가자의 수에 맞추어 hashmap이 하나씩 설정될 것이며, 만약 동명이인이 있으면 그 수 만큼 value가 설정될 것이다.

4. 여기서 완주한 참가자를 구해서 value를 하나씩 빼준다.

5. 그렇게 해서 구한 value들을 구하면, 완주한 경우 0이 나올 것이고 완주하지 못한 key의 value는 1일 것이다.

6. 그 value를 갖는 key가 정답이다.

 

 

코드

 

반응형