<TIL> 14. Hash, 코테 230216

YUJIN LEE·2023년 2월 16일
0

코딩테스트

목록 보기
3/7

Character.isDigit - 문자인지 숫자인지 확인할 수 있는 함수

(int)(Math.log10(n)+1 => 정수의 자릿수 구하기!

String str = n + ""; --> n을 string으로 형변환 !!
int[] answer = new int[str.length()];--> str의 길이만큼 int 배열 생성

.equals()와 ==의 차이

equals는 메소드이며, 객체끼리 내용을 비교할 수 있도록 한다.
== 는 비교를 위한 연산자이다

equals 메소드는 비교하고자 하는 대상의 내용자체를 비교!!!!!
== 연산자는 비교하고자 하는 대상의 주소값을 비교!!!

따라서 배열 안의 value값을 비교하고 싶을때는 equals 메소드를 쓰자!

Hash

HashMap이란?

Key-Value의 Pair를 관리하는 클래스.
HashMap<String, Integer>로 지정하면 Key는 String 형태, Value는 Integer 형태로 정의하는 것.

해쉬를 사용한 문제?

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

  • 해시 더 공부해보기
    [프로그래머스] 전화번호 목록 (해시 Lv. 2)
    [프로그래머스] 위장 (해시 Lv. 2)
    [프로그래머스] 베스트 앨범 (해시 Lv. 3)

1) HashMap 만들기
Key는 Participant의 이름
Value는 Count
String/Integer 지정

2) HashMap에 Participant 추가
Hashing한다라고도 표현.
HashMap에 Participant를 전부 추가.
* HashMap.put(Key, Value): HashMap에 Key와 Value를 한 쌍으로 입력하는 함수

이 문제에서는 Count Table을 만들어 각 Participant의 Count를 세어 놓는다.
다음 단계에서는 완주한 사람들은 Value를 1씩 빼는 동작, 남아있는 한 사람이 완주하지 못한 선수가 됨.

  • HashMap.getOrDefault('B', 0)
    - 이 함수는 'B'라는 Key에 해당하는 Value가 있으면 가져오고, 아닐 경우 0을 Default로 지정하여 사용하겠다는 의미의 함수.
    • "Value를 전부 1로?" -> 동명이인이 있는 예외 케이스를 고민.
    • 즉, HashMap이 Count Table과 동일한 역할을 해야함. 단순히 0/1로 있다 없다 표현으로는 부족, A라는 이름을 가진 참가자가 몇명인지 알아야함.

3) HashMap에서 완주한 선수 빼기

  • 각 선수들의 이름이 Key로 들어감. 그 이름을 가진 사람이 몇명 있는지 Value로 Hash Map을 완성.
  • 그렇다면, 이 HashMap에서 완주자들을 제외시키면, 한 명만 남음. => 정답

4) Value가 0이 아닌 참가자 찾기

  • 남아있는 1명이 완주하지 못한 사람이니, 이제 HashMap을 한번 돌면서 Value가 0이 아닌 사람 찾으면 된다.
  • HashMap.keySet(): HashMap이 들고 있는 전체 Key의 배열을 반환하는 함수
  • HashMap.get(Key): Key에 해당하는 Value를 반환하는 함수
    즉, 전체 Key를 하나씩 확인해서 Value가 0이 아닌 경우 answer에 담아주는 동작

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;
    }
}

다른분이 푸신 코드이다. 진짜 깔끔하고 잘짰길래 가져와봤다.

    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);

            Iterator<Map.Entry<String, Integer>> iter = map.entrySet().iterator();

            while(iter.hasNext()){
                Map.Entry<String, Integer> entry = iter.next();
                if(entry.getValue() != 0){
                    answer = entry.getKey();
                    break;
                }
            }

            return answer;
        }
    }

iterator

iterate: (계산, 컴퓨터 처리 절차를) 반복하다
iterator: 반복자

iterator는 ArrayList, HashSet과 같은 컬렉션을 반복하는 데 사용할 수 있는 객체.
=> 반복자.

Map.Entry 인터페이스

  • Map 인터페이스 내부 인터페이스(inner interface)
  • Map에 저장되는 key-value 쌍을 다루기 위해 내부적으로 Entry 인터페이스를 정의
  • Map 인터페이스를 구현하는 클래스에서는 Map.Entry인터페이스도 함께 구현
  • 맵에 저장되는 엔트리의 조작을 위한 메소드 정의

메소드

  • boolean equals(Object o) - 동일한 Entry인지 비교
  • Object getKey() - Entry의 key의 객체를 반환
  • Object getValue() - Entry의 value 객체를 반환
  • int hashCode() - Entry의 해쉬코드를 반환
  • Object setValue(Object value) - Entry의 value 객체를 지정된 객체로 변경
import java.util.*; 
class Solution {
        public long solution(long n) {
            long answer = 0;

            String str = Long.toString(n);
            String[] arr = str.split("");

            Arrays.sort(arr, Collections.reverseOrder());
            str = String.join("",arr);
            answer = Long.parseLong(str);

            return answer;
        }
    }

String str = Long.toString(n); -> n을 string으로 바꿔줌
String[] arr = str.split(""); -> 공백없이 배열로 스트링을 나눠줌
Arrays.sort(arr, Collections.reverseOrder()); -> 내림차순으로 정렬
str = String.join("",arr); -> 배열 합치기
answer = Long.parseLong(str); -> long 타입으로 변환

프로그래머스 문제

0개의 댓글