will come true

[프로그래머스 / Level1] 완주하지 못한 선수 (Java) 본문

Algorithm

[프로그래머스 / Level1] 완주하지 못한 선수 (Java)

haehyun 2021. 11. 5. 22:45
728x90

문제

https://programmers.co.kr/learn/courses/30/lessons/42576?language=java# 

 

코딩테스트 연습 - 완주하지 못한 선수

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

programmers.co.kr

 

핵심 키워드

  • 해시(Hash)
  • HashMap
  • Map.Entry
  • 문자열 비교 .equals()

 

풀이

  • participant 에는 있고, completion에는 없는 한명의 이름 구하기

 

Sort / Loop를 사용한 코드

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])){
                break;
            }
        }
        
        return participant[i];
    }
}

 

  1. participant배열과 completion 배열을 정렬(Sort)
  2. completion배열의 길이 만큼 두 배열의 요소를 비교하는 걸 반복(Loop)
    두 배열은 요소 하나를 제외하고는 전부 같기 때문에, 정렬을 하면 같은 위치에 같은 값이 있어야 한다. 같은 위치에 갑자기 다른 값이 온다면 그 값이 '완주하지 못한 한명'인 것.
  3. 반복 도중에 두 배열의 요소가 다르면 그 값이 '완주하지 못한 한명'.
  4. 반복문을 끝까지 돌았음에도 다른 값이 나오지 않았다면 participant의 마지막 값이 '완주하지 못한 한명'
    (completion이 participant보다 크기가 1작기 때문에 participant에는 비교하지 못한 값 하나가 남게됨)
  5. 반복문 중단 => i : break에 걸렸을 당시의 i값
    반복문 종료 => i : completion.length (=participant의 마지막 요소 인덱스)
  6. 두 배열의 요소(String)가 같은지 비교할 때 participant[i] != completion[i] 로 하지 않도록 주의하자.
    문자열간의 비교는 participant[i].equals(completion) 으로 하며, 두 개가 달라야 참이도록 !participant[i].equals(completion) 조건을 걸어줘야 한다.

 

Hash를 사용한 코드

*Hash : key-value 조합으로 구성된 자료구조. (ex: HashSet, HashMap)

import java.util.HashMap;
import java.util.Map.Entry;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> map = new HashMap<>();
        for(String player : participant){
        	map.put(player, map.getOrDefault(player, 0) + 1);
        }
        
        for(String player : completion) {
        	map.put(player, map.get(player) - 1);	//completion의 모든 요소는 participant에 무조건 있음
        }
        
        for(Entry<String, Integer> entry : map.entrySet()) {
        	if(entry.getValue().intValue() != 0) {
        		answer = entry.getKey();			//key가 선수이름, value는 사람 수
        		break;
        	}
        }
        
        return answer;
    }
}

 

  1. participant배열로 [participant값(key) : 사람 수(value)] 형태의 Hash 생성 
  2. Hash에서 completion의 요소를 찾아, value값을 1차감.
  3. 마지막에 value값으로 1이 남아있는 요소가 '완주하지 못한 한명'

 

HashMap 메서드

메서드 설명
Object put(Object key, Object value) 지정된 키와 값을 HashMap에 저장
Object get(Object key) 지정된 키(key)의 값(객체)을 반환, 못찾으면 null 반환.
getOrDefault(Object key, Object dafaultValue) 지정된 키(key)의 값(객체)을 반환, 키를 못 찾으면 기본값(defaultValue)로 지정된 객체를 반환.
Set entrySet() HashMap에 저장된 키와 값을 Entry(key와 value의 결합)의 형태로 Set에 저장해서 반환
Set keySet() HashMap에 저장된 모든 키가 저장된 Set을 반환
Collection values() HashMap에 저장된 모든 값을 컬렉션의 형태로 반환

 

Map.Entry 메서드

*Map.Entry 인터페이스 : Map인터페이스의 내부 인터페이스. Map에 저장되는 key-value쌍을 객체지향적으로 다루기 위해 내부적으로 정의해 놓은 것이다.

메서드 설명
boolean equals(Object o) 동일한 Entry인지 비교한다.
Object getKey() Entry의 key객체를 반환한다.
Object getValue() Entry의 value객체를 반환한다.
int hashCode() Entry의 해시코드를 반환한다.
Object setValue(Object value) Entry의 value객체를 지정된 객체로 바꾼다.

 

728x90
Comments