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

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

GAEBAL 2022. 6. 28. 19:13
728x90

문제

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

 

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

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

programmers.co.kr

 

 

풀이

해시 문제라고 써있어서 그냥 해쉬로 쉽게 풀었다.

 

이제

// hashMap에 사람 추가
// 동명이인이 있을 수도 있으니 이미 있는 사람이면 원래 값에 +1
for (String name : participant) {
    hashMap.put(name, hashMap.getOrDefault(name, 0) + 1);
}

getOrDefault() 함수는 잘 쓸 수 있게 된 것 같다!

 

근데 마지막에 출력하기 전에

for (String name : hashMap.keySet()) {
    if (hashMap.get(name) != 0) { // name을 이름으로 가진 사람이 있으면 그 사람이 완주하지 못한거임!
        answer = name;
        break;
    }
}

hashMap.keySet() 함수를 비롯한 hashMap의 함수들은 더 자연스럽게 사용할 수 있게 공부해놔야겠다!!

 

해시말고 그냥 배열을 정렬해서 앞에서부터 비교하다가 다르면 그 사람을 출력하는 방식으로도 풀 수 있음!!

 

자세한건 주석으로!

 

 

코드

// 코딩테스트 연습 - 해시 - 완주하지 못한 선수
// https://programmers.co.kr/learn/courses/30/lessons/42576

package PROGRAMMERS.level1;

import java.util.HashMap;

public class Num42576_완주하지못한선수 {
    private static class Solution {
        private String solution(String[] participant, String[] completion) {
            HashMap<String, Integer> hashMap = new HashMap<String, Integer>();

            // hashMap에 사람 추가
            // 동명이인이 있을 수도 있으니 이미 있는 사람이면 원래 값에 +1
            for (String name : participant) {
                hashMap.put(name, hashMap.getOrDefault(name, 0) + 1);
            }

            // 이걸로도 가능
//            for (int i = 0; i < participant.length; i++) {
//                hashMap.put(participant[i], hashMap.getOrDefault(participant[i], 0) + 1);
//            }


            // 완주한 사람은 -1씩 해주기
            for (String name : completion) {
                hashMap.put(name, hashMap.get(name) - 1);
            }

            // 이걸로도 가능
//            for (int i = 0; i < completion.length; i++) {
//                hashMap.put(completion[i], hashMap.getOrDefault(completion[i], 0) - 1);
//            }

            String answer = "";

            for (String name : hashMap.keySet()) {
                if (hashMap.get(name) != 0) { // name을 이름으로 가진 사람이 있으면 그 사람이 완주하지 못한거임!
                    answer = name;
                    break;
                }
            }

            return answer;
        }
    }

    public static void main(String[] args) {
        Solution sol = new Solution();

        System.out.println(sol.solution(new String[]{"leo", "kiki", "eden"}, new String[]{"kiki", "eden"}));
        System.out.println(sol.solution(new String[]{"marina", "josipa", "nikola", "vinko", "filipa"}, new String[]{"josipa", "filipa", "marina", "nikola"}));
        System.out.println(sol.solution(new String[]{"mislav", "stanko", "mislav", "ana"}, new String[]{"stanko", "ana", "mislav"}));
    }
}

 

 

참고 - HashMap 메서드!

https://gre-eny.tistory.com/97

 

[Java] HashMap 메소드 및 사용법

HashMap HashMap을 정의한다면, '키에 대한 해시 값을 사용하여 값을 저장하고 조회하며, 키-값 쌍의 개수에 따라 동적으로 크기가 증가하는 associate array'라고 할 수 있으며, 이 associate array(연관 배열)

gre-eny.tistory.com

코딩 테스트에서 자주 쓰일 것 같은 애들?

  • get(), getOrDefault(), put() 등은 당연한 거고
  • clear() - hashmap 안의 애들을 다 날려줌
  • remove() - key에 해당하는 <key, value> 쌍을 없애고 value 반환. 없으면 null 반환
  • entrySet() - hashMap의 모든 요소를 'key = value' 형태로 묶어 Set으로 반환
  • keySet() - 모든 요소의 키만 'key' 형태로 묶어서 Set으로 반환
  • values() - 모든 요소의 값만 묶어 반환
  • 등등
728x90