github.com/taemin-kwon93 Github 보러가기 ->

Data Structures and Algorithms/Problems

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

태민Kwon 2024. 8. 5. 19:11

완주하지 못한 선수 링크

 

프로그래머스

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

programmers.co.kr

 

문제 설명:

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

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

 

입출력 예

participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"

 


  • B집합은 A집합의 부분집합이다.
  • 전체 집합에는 동명이인이 있을 수 있다. (["mislav", "stanko", "mislav", "ana"],["stanko", "ana", "mislav"] )

 

문제 풀이:

  1. 참여 선수들을 Map<String, Integer> 로 저장한다.
  2. 해당 자료형으로 부터 B집합에 있는 선수들의 이름을 하나씩 제거한다.
  3. 남은 선수 한명을 return 한다.
public class IncompleteRunner {
    public String solution(String[] a, String[] b) {
        Map<String, Integer> map = new HashMap<>();
        for (String s : a) map.put(s, map.getOrDefault(s, 0) + 1);
        for (String s : b) {
            map.put(s, map.get(s) - 1);
            if (map.get(s) <= 0) map.remove(s);
        }
        return map.entrySet().iterator().next().getKey();
    }
}

 

본 문제는 해시를 이용한 풀이를 의도했지만, 아래와 같이 간단한 풀이도 가능하다.

두 집합에서 한개의 요소씩 조회해가며 다른 요소가 발견됐을 시 return 하는 것이다.

public String solution(String[] a, String[] b) {
    Arrays.sort(a);
    Arrays.sort(b);

    for (int i = 0; i < b.length; i++) {
        if (!b[i].equals(a[i])) return a[i];
    }

    return a[a.length - 1];
}

 

위 문제에 대한 테스트코드는 아래와 같이 작성했다.

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import static org.junit.jupiter.api.Assertions.*;

class IncompleteRunnerTest {
    private IncompleteRunner incompleteRunner;

    @BeforeEach
    void setUp() {
        incompleteRunner = new IncompleteRunner();
    }

    @ParameterizedTest
    @CsvSource({
            "'leo,kiki,eden', 'eden,kiki'",
            "'marina,josipa,nikola,vinko,filipa','josipa,filipa,marina,nikola'",
            "'mislav,stanko,mislav,ana', 'stanko,ana,mislav'"
    })
    void solution(String a, String b) {
        String[] participant = a.split(",");
        String[] completion = b.split(",");

        String result = incompleteRunner.solutionB(participant, completion);
        System.out.println(result);
    }
}