본문 바로가기
공부/알고리즘

[프로그래머스]42576_완주하지 못한 선수_Java 풀이 2가지

by happyeuni 2023. 1. 25.

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

 

프로그래머스

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

programmers.co.kr

 

풀이

처음에는 Array의 기본 내장 정렬을 이용하여 풀었다.

두 번째 방법으로는 기본 문제 카테고리와 같은 HashMap을 사용하여 풀었다.

중간에 주의할 점은 코드에 주석으로 달아놓았다. 역시 Hash가 엄청나게 빠르다.

코드

HashMap 사용한 풀이

package Hash;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Solution_42576 {
    public static void main(String[] args) {
//        String[] participant = {"leo", "kiki", "eden"};
//        String[] completion = {"eden", "kiki"};
        String[] participant = {"marina", "josipa", "nikola", "vinko", "filipa"};
        String[] completion = {"josipa", "filipa", "marina", "nikola"};

        System.out.println(solution(participant,completion));

    }
    public static String solution(String[] participant, String[] completion) {
        String answer = "";
        StringBuilder sb = new StringBuilder();

        /* HashMap 사용 */
//        HashMap<String,Boolean> player = new HashMap<>(); // 동명이인이 있기 때문에 Boolean으로 false->true로 하는 방식은 불가능
        HashMap<String,Integer> player = new HashMap<>();

        for (int i = 0; i < participant.length; i++) {
            // getOrDefault: 지정된 키의 값을 반환하는데 키를 못찾으면, 기본 값으로 지정된 객체를 반환.
            player.put(participant[i], player.getOrDefault(participant[i],0)+1);
        }
        for (int i = 0; i < completion.length; i++) {
            player.put(completion[i],player.getOrDefault(completion[i],0)-1);
        }

        // 완주했다면 +1-1=0으로 0의 값을 가지게 될테고, 완주하지 못했다면 +1의 값을, 동명이인이 있는데 완주하지 못했다면 +1+1-1=+1이 될테니
        // 여러명이든지 한명이든지 간에 완주한사람:0의 value, 완주하지 못한 사람: 1의 value를 가지게 될 것임.
        for (Map.Entry<String,Integer> p:player.entrySet()) {
            if(p.getValue() == 1) sb.append(p.getKey());
        }

        answer = sb.toString();
        return answer;
    }
}

hash를 이용하여 속도가 다소 빠르다

 

 

내장 정렬 함수 사용 풀이

package Hash;

import java.util.Arrays;

public class Solution_42576 {
    public static void main(String[] args) {
//        String[] participant = {"leo", "kiki", "eden"};
//        String[] completion = {"eden", "kiki"};
        String[] participant = {"marina", "josipa", "nikola", "vinko", "filipa"};
        String[] completion = {"josipa", "filipa", "marina", "nikola"};

        System.out.println(solution(participant,completion));

    }
    public static String solution(String[] participant, String[] completion) {
        String answer = "";
        StringBuilder sb = new StringBuilder();

        // Array로 해결하기 -> 정렬 후 다르면 출력하고 끝내기.
        Arrays.sort(participant);
        Arrays.sort(completion);
        for (int i = 0; i < completion.length; i++) {
            if(participant[i].equals(completion[i])){ //if(participant[i]!=completion[i]){
                sb.append(participant[i]);
                break;
            }
        }

        if(sb.length()==0){ // 정렬했을 때 맨 마지막 선수만 다르다면
            sb.append(participant[participant.length-1]);
        }

        answer = sb.toString();
        return answer;
    }
}

정렬을 이용하여 속도가 다소 느리다

 

 

참고

정렬인데, 더 깔끔한 풀이 wow

import java.util.*;
class Solution {
    public String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);
        int i;
        for ( i=0; i<completion.length; i++){

            if (!participant[i].equals(completion[i])){
                return participant[i];
            }
        }
        return participant[i];
    }
}

 

 

댓글