////////
Search
🌱

이소영

해시

데이터를 다루는 기법 중 하나로, 검색과 저장을 빠르게 할 수 있음
해시가 데이터를 검색할 때 빠른 이유가 무엇인가요?
Key와 Value가 한 쌍으로 존재하고, Key값을 이용해서 빠르게 검색할 수 있기 때문

전화번호 목록

Arrays.sort() & String class의 startsWith()

접근 방법

phone_book 배열을 Arrays.sort()로 정렬한 뒤 반복문을 이용하여 startsWith()로 앞뒤 비교하기

소스코드

import java.util.Arrays; public class Solution{ // 전화번호 목록 public static void main(String[] args) { // String[] phone_book = {"119", "97674223", "1195524421"}; // String[] phone_book = {"97674223", "119", "1195524421"}; // String[] phone_book = {"123","456","789"}; // String[] phone_book = {"12","123","1235","567","88"}; String[] phone_book = {"819232312", "976", "119552", "2"}; System.out.println(solution(phone_book)); } private static boolean solution(String[] phone_book) { Arrays.sort(phone_book); // 확인 System.out.println(Arrays.toString(phone_book)); for (int i = 0; i < phone_book.length-1; i++) { if(phone_book[i+1].startsWith(phone_book[i])) { return false; } } return true; } }
Java
복사

HashSet

접근 방법

HashSet에 phone_book에 있는 원소들을 모두 집어 넣은 후 2중 for문을 이용하여 각 phone_book의 원소와 HashSet에 있는 모든 key값들과 비교 HashSet에 있는 Key와 비교할 때 각 phone_book의 원소들을 최소 한 글자(첫 글자)부터 최대 HashSet의 원소의 길이까지만 substring()을 이용하여 잘라서 비교

소스코드

import java.util.HashSet; public class Solution { // 전화번호 목록 public static void main(String[] args) { // String[] phone_book = {"119", "97674223", "1195524421"}; // String[] phone_book = {"97674223", "119", "1195524421"}; // String[] phone_book = {"123","456","789"}; // String[] phone_book = {"12","123","1235","567","88"}; String[] phone_book = {"819232312", "976", "119552", "2"}; System.out.println(solution(phone_book)); } private static boolean solution(String[] phone_book) { HashSet<String> hash = new HashSet<>(); for (int i = 0; i < phone_book.length; i++) { hash.add(phone_book[i]); } for (String num : phone_book) { for (int j = 1; j < num.length(); j++) { if(hash.contains(num.substring(0, j))) { return false; } } } return true; } }
Java
복사

위장

HashMap

접근 방법

HashMap을 사용하여 2차원 배열인 clothes의 옷의 타입(key)별로 개수(value) 저장   
착용을 안한 경우(none)까지 합쳐서 value를 1부터 +1
map의 값들을 모두 answer에 곱해주기   
곱셈을 하기 위해 answer = 0이 아닌 answer = 1
‘제한사항의 스파이는 하루에 최소 한 개의 의상은 입습니다. ‘를 위해 answer - 1(옷 타입이 모두 none인 상태) 후
return
import java.util.HashMap; public class Solution{ // 위장 public static void main(String[] args) { String[][] clothes = { { "yellowhat", "headgear" }, { "bluesunglasses", "eyewear" }, { "green_turban", "headgear" } }; System.out.println(solution(clothes)); } private static int solution(String[][] clothes) { // int answer = 0; // 2가지 이상의 조합 HashMap<String, Integer> map = new HashMap<>(); for (int i = 0; i < clothes.length; i++) { String t = clothes[i][1]; map.put(t, map.getOrDefault(t, 1) + 1); // 착용을 안했을때까지 합쳐서 1부터 시작 } // 확인 for (String key : map.keySet()) { System.out.println(String.format("타입 : %s, 값: %d", key, map.get(key))); } int answer = 1; // 조합의 수 구하기 for (int cnt : map.values()) { answer *= cnt; } answer -= 1; // 모두 착용x return answer; } }
Java
복사

베스트앨범

HashMap

import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; public class Solution { // 베스트 앨범 public static void main(String[] args) { String[] genres = {"classic", "pop", "classic", "classic", "pop"}; int[] plays = {500, 600, 150, 800, 2500}; System.out.println(solution(genres, plays)); } private static int[] solution(String[] genres, int[] plays) { // 1. 속한 노래가 가장 많은 장르 HashMap<String, Integer> map = new HashMap<>(); for (int i = 0; i < genres.length; i++) { String genre = genres[i]; map.put(genre, map.getOrDefault(genre, 0) + plays[i]); } // 확인 System.out.println("====================1====================="); for (String key : map.keySet()) { System.out.println(String.format("장르명 : %s, 재생횟수: %d", key, map.get(key))); }System.out.println(); List<String> listKeySet = new ArrayList<>(map.keySet()); // 내림차순 정렬 Collections.sort(listKeySet, (value1, value2) -> (map.get(value2).compareTo(map.get(value1)))); // 확인 System.out.println("====================2====================="); for(String key : listKeySet) { System.out.println("key : " + key + " , " + "value : " + map.get(key)); }System.out.println(); // 2. 재생 횟수가 가장 많은 노래 ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < listKeySet.size(); i++) { String genre = listKeySet.get(i); // 첫번째 int max = 0; int first = -1; for (int j = 0; j < genres.length; j++) { if(genre.equals(genres[j]) && max < plays[j] && j != first) { max = plays[j]; first = j; } } // 두번째 max = 0; int second = -1; for (int j = 0; j < genres.length; j++) { if(genre.equals(genres[j]) && max < plays[j] && j != first) { max = plays[j]; second = j; } } list.add(first); // 한 장르에 한곡만 있을 경우에는 두번째 곡 추가 x if(second != -1) { list.add(second); } } int[] result = new int[list.size()]; for (int j = 0; j < list.size(); j++) { result[j] = list.get(j); } System.out.println(Arrays.toString(result)); return result; } }
Java
복사