본문 바로가기

Programming/[Algorithm]

[Programmers] 완주하지 못한 선수

 

 

코딩 테스트를 준비하면서 기본적으로 Programmers(https://programmers.co.kr/learn/challenges)에서 코딩 테스트를 진행

 

해당 내용으로 코딩을할 때 언어를 선택할 수 있습니다.

 

(전 Java와 JavaScript 두가지로 진행해 보았습니다.)

 

먼저 입출력 예를 보면서 완주한 사람의 이름만 제거해주고 결과값을 보여줘야겠다는 생각에 코드를 작성

 

Java 버전

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Arrays;
import java.util.ArrayList;
 
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        ArrayList<String> participantList = new ArrayList<>(Arrays.asList(participant));
        ArrayList<String> completionList = new ArrayList<>(Arrays.asList(completion));
        for (int i = 0; i < completionList.size(); i++) {
            participantList.remove(completionList.get(i));
        }
        
        answer = String.join("", participantList);
        System.out.println(participantList.toString());
        
        return answer;
    }
}
cs

 

JavaScript 버전

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function solution(participant, completion) {
    var answer = '';
    var answerArray = [];
    for (var i = 0; i < completion.length; i++) {
        participant.splice(participant.indexOf(completion[i]), 1);
    }
    for (var idx = 0; idx < participant.length; idx++) {
        if (typeof participant[idx] != 'undefined') {
            answerArray.push(participant[idx]);
        }
    }
    answer = answerArray.toString();
    return answer;
}
cs

 

간단히 생각하였지만 효용성 0점.... 정확성은 100점 평균 50점으로 실패하였습니다.

 

해결방안 

1. 문제가 의도하는 바를 파악하지 못함

2. remove() 함수 자체가 성능이 좋지 않음

 

이 문제는 HashMap으로 처리를 하기 위한 것이다. (물론 풀이법은 여러가지가 있을 수 있음)

 

Java 버전

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.HashMap;
 
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> participantMap = new HashMap<>();
        for (String participantMember : participant) {
            participantMap.put(participantMember, participantMap.getOrDefault(participantMember, 0+ 1);
        }
        for (String completionMember : completion) {
            participantMap.put(completionMember, participantMap.get(completionMember) -1);
        }
        
        for (String member : participantMap.keySet()) {
            if (participantMap.get(member) == 1) {
                answer = member;
                break;
            }
        }
        
        return answer;
    }
}
cs

 

가장 도움이 되었던 것은 getOrDefault() 함수

getOrDefault

 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드

사용 방법

getOrDefault(Object key, V DefaultValue)

매개 변수 : 이 메서드는 두 개의 매개 변수를 허용합니다.

  • key : 값을 가져와야 하는 요소의 키입니다.
  • defaultValue : 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값입니다.

반환 값 : 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환됩니다.

 

위 함수를 사용한 이유는 이름이 겹치는 참여자가 존재하기 때문입니다.

 

그래서 모든 참여자에게 1이라는 값을 주고 이름이 겹치면 +1을 해줍니다.

 

그리고 완주자에게는 참여자 Map에 -1씩하여 Map에 값이 0이 아닌 1인 사람을 찾도록 수정하였습니다.

 

 

 

추가

 

JavaScript 버전

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function solution(participant, completion) {
    var answer = '';
    var participantJson = {};
    for (var idx = 0; idx < participant.length; idx++) {
        var participantName = participant[idx];
        if (!participantJson[participantName]) {
            participantJson[participantName] = 1;
        } else {
            participantJson[participantName] += 1;
        }
    }
    for (var i = 0; i < completion.length; i++) {
        var completionName = completion[i];
        if (participantJson[completionName]) {
            participantJson[completionName] = participantJson[completionName] - 1;
        }
    }
    for (var index = 0; index < Object.keys(participantJson).length; index++) {      
        var participantJsonKey = Object.keys(participantJson)[index];
        if (participantJson[participantJsonKey] && participantJson[participantJsonKey] != 0) {
            answer = participantJsonKey;
        }
    }
    return answer;
}
cs

비슷한 방식으로 구현해보려고 했으나 이것 역시 효용성 0점.........

 

다른 방식을 구상해보고 수정하려고 하나 현재 시간이 넉넉지 않아 JavaScript버전에 대해서는

 

어떻게 해결하였는지는 추후에 포스팅하도록 하겠습니다.

'Programming > [Algorithm]' 카테고리의 다른 글

[Programmers] K번째수  (0) 2021.12.21