hoon's bLog

Java 프로그래머스 완주하지 못한 선수 자바 본문

코딩테스트/프로그래머스

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

개발한기발자 2023. 2. 23. 12:11
반응형

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

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

programmers.co.kr

[문제 설명]

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

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때,

완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해 주세요.

[제한 조건]

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

[입출력 예]

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"

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

 

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

 

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

 

[먼저 생각해 보기]

배열로 주어지는 참여자(participant), 완주자(completion)를 어떻게 비교할 것인가?

정렬 후 비교한다면 반복문 사용 시, 인덱스에 따라 순차적으로 비교 가능할 듯하다!!

 

[나의 풀이]

import java.util.Arrays;

class Solution {
    public String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);

        for (int i = 0; i < completion.length; i++) {
            if(!participant[i].equals(completion[i])){
                return participant[i];
            }
        }
        return participant[participant.length-1];
    }
}

배열이기 때문에 Arrays.sort를 이용해서 participant와 completion를 오름차순으로 정렬!

이후 값을 비교하여 해당하는 값 String으로 return!

물론 이렇게도 풀 수 있다.

하지만 이번 문제는 해시맵으로 풀어야 하는 알고리즘 문제이다!

추후 포스팅을 통해 해시맵(HashMap)에 대해 설명하겠지만, Java에서 사용하는 Collection Framework 중에 하나로,

Map <key, value> 형식으로, key 값을 통해 value를 put, get 메서드를 사용하여 데이터를 가공한다!

다른 사람의 풀이를 보며 코드를 해석해 보자!

 

[다른 사람의 풀이]

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        
        for (String player : participant)
            hm.put(player, hm.getOrDefault(player, 0) + 1);
            
        for (String player : completion)
            hm.put(player, hm.get(player) - 1);

        for (String key : hm.keySet()) {
            if (hm.get(key) != 0){
                answer = key;
            }
        }
        return answer;
    }
}

우선 key 타입은 String, value 타입은 Integer을 가지는 HashMap hm을 선언!

foreach로 HashMap hm에 participant와 completion 각각의 key로 player, value로 int값을 넣어준다.

 

이때 getOrDefault 메서드를 이용해 value값을 setting 하는데,

getOrDefault는 찾는 key가 존재한다면 찾는 key의 value를 반환, 없거나 null이면 default 값 반환한다.

위 코드에서는 player가 가지고 있는 value가 없기 때문에 0을 반환 후 1을 더해, 그 값을 hm에 player key와 put 해준다.

getOrDefault 원형은 아래와 같다.

맵변수명.getOrDefault(key값, default값)

이어서 completion 배열에 요소를 hm에 다시 put 해줄 때, 기존에 hm에서 각 player가 가지고 있는 value를 get 해서,

1을 빼면 완주한 player는 0의 value를 가지게 된다.

그리고 key값을 가져와 비교해야 하는데 이때 사용되는 것이 keySet()!!

keySet()은 해당 Map의 key만 반환하게 된다.

위 코드에서, hm.keySet()으로 [leo, kiki, eden]의 key를 반환하고, 0이 아닌 key값을 return 한다!

 

[정리]

개인 피셜 난이도 : ★

Map은 실무에서 정말정말정말 많이 쓰인다!!!!!!!

대부분 실무에서 쓰이는 로직들의 절반 이상은 for문, if문, Map으로 이루어져 있다.

때문에 이 세 가지를 적절하게, 때에 맞게 사용한다면, 실전에서도 큰 어려움은 없다.(초반 코드분석 한정...)

 

추가로, 난이도 한 개도 아까울 만큼 쉬워서 포스팅 건너뛴 문제들도 있다.

그런 문제들은 아래 내 github에서 검색하여 소스 참고하면 되겠다!

https://github.com/chrishoonS/codeTest

 

GitHub - chrishoonS/codeTest: programmers codeTest

programmers codeTest. Contribute to chrishoonS/codeTest development by creating an account on GitHub.

github.com

 

언제나 새로운 정보 공유와 잘못된 정보

비판/지적/태클은 환영입니다!

 

끝.

728x90
반응형