-
프로그래머스 Hash 문제풀이 - JavaJava/코딩테스트 2023. 4. 26. 22:45
🍡 Hash
- 임의의 데이터를 고정된 크기의 대표값으로 변환해서 저장하는 것, 데이터를 해시함수(어떤 연산) 통해 해시값을 얻어냄.
- 해시함수를 어떻게 정의하는지에 따라 다른 데이터여도 하나의 해시값이 될 수도 있음(해시 충돌)
- 객체는 기본적으로 할당된 주소값을 이용하여 해시 값 생성
- 해시 테이블 : 해시 값을 사용하여 이에 대응하는 원본 데이터를 찾을 수 있게 해주는 자료구조로, 역함수는 존재하지 않는다 (해시는 단방향 변환, 충돌을 허용하기 때문에 역함수 존재 x)
- 해시 값으로 원본 데이터에 바로 접근이 가능, 따라서 빠른 시간에 데이터 검색, 삽입, 삭제가 가능하다.
🍡 HashSet
- 중복을 허용하지 않는 집합
- 데이터 순서 없음
- add : 데이터 삽입
- contains : 해당 원소 포함 여부(boolean return)
import java.util.*; Set<Integer> set = new HashSet<>(); set.add(1); set.add(1); // set은 중복 허용 x, 집합에 변화 x set.add(2); set.add(3); System.out.println(set.contains(1)); // true System.out.println(set.contains(4)); // false Iterator<Integer> iter = set.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); } // 1 // 2 // 3 출력
🍡 프로그래머스 - 전화번호 목록
https://school.programmers.co.kr/learn/courses/30/lessons/42577
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 모든 전화번호를 set 에 저장해두기
- 한 전화번호 읽고 0 ~ phone_book[i].length()만큼 쪼개서 해당 문자열이 set에 포함되었는지 여부 탐색
ex) "123"읽음 -> 1있나 탐색 -> 12 있나 탐색 -> 123 있나 탐색 (j걸린 for문이 이 로직임)
class Solution { public boolean solution(String[] phone_book) { Set<String> set = new HashSet<>(); for (int i = 0; i < phone_book.length; i++) { set.add(phone_book[i]); } for (int i = 0; i < phone_book.length; i++) { for (int j = 0; j < phone_book[i].length(); j++) { if (set.contains(phone_book[i].substring(0, j))) { return false; } } } return true; } }
🍡 HashMap
- key - value 형태로 이루어짐
- key는 중복 허용하지 않는다. (value는 가능) 중복된 값이 들어오면 덮어씌워짐
- 데이터 순서 x
- put() : 데이터 삽입
- remove( 키 값 ) : 해당 데이터 삭제
- containsKey( 키 값 ) : 해당 키가 존재하는지 여부 (boolean return)
- clear() : 전체 요소 삭제
import java.util.*; Map<String, Integer> map = new HashMap<>(); map.put("나몰빼미", 1); map.put("브케인", 2); map.put("수댕이", 3); map.put("나몰빼미", 4); // 중복 key가 들어오면 원래 값 덮어씌워진다. System.out.println(map.get("나몰빼미")); // 4 map.remove("수댕이"); System.out.println(map.containsKey("수댕이")); // false (위에서 제거됨) Set<String> keySet = map.keySet(); for(String s : keySet) { System.out.println(s + " " + map.get(s)); } // 브케인 2 나몰빼미 4 출력 map.clear(); // 모든 요소 삭제 System.out.println(map.size()); // 0
🍡 프로그래머스 - 폰켓몬
https://school.programmers.co.kr/learn/courses/30/lessons/1845
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- map에다가 포켓몬 쭉 넣어두기, 이미 있는 애들은 value증가시키기
- 포켓몬 종류가 (map의 key 개수) 가질 수 있는 포켓몬 수(count)보다 많으면 count를, 종류가 더 적다면 종류 개수를 리턴
class Solution { public int solution(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); int count = nums.length / 2; for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])) { map.put(nums[i], map.get(nums[i]) + 1); } else { map.put(nums[i], 1); } } if (map.keySet().size() > count) { return count; } else { return map.keySet().size(); } } }
🍡 프로그래머스 - 완주하지 못한 선수
https://school.programmers.co.kr/learn/courses/30/lessons/42576
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 동명이인 있을 수 있으므로 map 에다가 이름 + 사람 수로 저장해두기
- 완주자 배열을 돌면서 map에서 value감소시키기, 값이 0이되면 map에서 제거
- map에 남아있는 애만 출력
import java.util.*; class Solution { public String solution(String[] participant, String[] completion) { Map<String, Integer> map = new HashMap<>(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < participant.length; i++) { if (map.containsKey(participant[i])) { map.put(participant[i], map.get(participant[i]) + 1); } else { map.put(participant[i], 1); } } for (int i = 0; i < completion.length; i++) { if (map.containsKey(completion[i])) { map.put(completion[i], map.get(completion[i]) - 1); if (map.get(completion[i]) == 0) { map.remove(completion[i]); } } } for (String s : map.keySet()) { sb.append(s); } return sb.toString(); } }
'Java > 코딩테스트' 카테고리의 다른 글
프로그래머스 디스크 컨트롤러 - Java (feat 우선순위 큐) (0) 2023.04.27 프로그래머스 DP 등굣길 Java (0) 2023.04.27 프로그래머스 Stack / Queue 문제풀이 - Java (0) 2023.04.21 백준 23290 (0) 2023.04.08 백준 17142 (0) 2023.04.08