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

Hoehenflug·2021년 12월 13일
0

프로그래머스

목록 보기
2/13

1. 문제 풀이 고민

  • Arrays.sort 메서드를 이용해 정렬한 뒤 순서대로 값을 비교해 맞지 않는 값을 찾아내는 방법을 생각
  • 하지만 해당 문제는 hash 문제...
  • participant와 completion 각각 hashMap을 선언해 각각의 key와 value를 비교...? 하는 방향으로 접근
  • 해결 방법이 떠오르지 않아 sort 메서드를 사용해 우선 문제를 해결하기로 함

2. 방법 1 - hashMap 사용 안함

import java.util.Arrays;

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];
    }
}
  • Arrays.sort() 메서드 사용
  • for문에서 사용할 int i는 for문 밖에서 선언해 for문 밖에서도 유효하도록 만듦
  • equals 메서드 사용해 participant의 값과 completion의 값 동일한지 비교
  • 완주하지 못한 선수가 participant 배열의 마지막 index에 위치할 경우 for문의 if문 실행 안됨
    => 자동으로 participant의 마지막 요소 리턴하도록 구현

3. 방법 2 - hashMap 사용

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String result = "";
        HashMap<String, Integer> hashMap = new HashMap<>();
        for(String p : participant){
            hashMap.put(p, hashMap.getOrDefault(p, 0) + 1);
        }
        for(String c : completion){
            hashMap.put(c, hashMap.get(c) - 1);
        }
        for(String key : hashMap.keySet()){
            if(hashMap.get(key) != 0){
                result = key;
                break;
            }
        }
        return result;
    }
}
  • hashMap을 따로 2개를 선언하는 것이 아니라 하나만 선언해 사용하는 방법
  • participant를 반복하는 동안 hashMap에 참가한 선수 이름(String p)과 Integer를 삽입
    • getOrDefault를 이용해 이름 중복 체크
    • HashMap의 put은 key가 존재하면 value를 새로운 값으로 변경되기 때문
    • 이미 등록된 동명이인이 한 명 있다면 hashMap.getOrDefault로 인해서 2라는 값이 들어감
    • p가 존재하면 p의 값을 반환하고, 없다면 기본 value인 0 반환한 뒤 +1
  • completion을 반복하는 동안에는 hashMap의 value를 가져와 -1을 함
  • hashMap에서 key를 가져와 value가 0이 아니면 완주하지 못한 선수이므로 key의 값 return

4. 배운 점

getOrDefault(Object key, V defaultValue) : 찾는 key가 존재한다면 찾는 key의 value을 반환하고 없다면 기본 value을 반환

String[] arr1 = {"qwe", "asd", "zxc", "qwe"};
String[] arr2 = {"qwe", "asd", "zxc"};

Map<String, Integer> map = new HashMap<>();
for(String a : arr1) map.put(a, map.getOrDefault(a, 0) + 1);
System.out.println(map);
// {qwe=2, asd=1, zxc=1}

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

0개의 댓글