import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
int ans = 0;
Arrays.sort(participant);
Arrays.sort(completion);
for(int i=0; i<completion.length; i++) {
if(!participant[i].equals(completion[i]) {
ans = i;
break;
}
if(i==completion.length-1) ans = i+1;
}
return participant[ans];
}
}
처음에는 HashMap에 대해서 공부하지 않아서 배열을 사용해서 풀었다.
같은 이름이 없으므로 정렬하고 이름이 다른 경우 해당 인덱스의 선수이름을 출력하도록 코드를 짰다.
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;
}
}
이후 HashMap에 대해 공부하고 사용해보니 실행 시간이 확실히 빨라진 것을 확인할 수 있었다.
그리고 getOrDefault(Object key, V DefaultValue)라는 메서드는 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드인데 적용해보니 코드가 훨씬 간단하고 깔끔해졌다 👍👍👍
import java.util.HashMap;
class Solution {
public boolean solution(String[] phone_book) {
HashMap<String, Integer> hm = new HashMap<>();
for(String phone: phone_book) {
hm.put(phone, 0);
}
for(String phone: phone_book) {
for(int i=1; i<phone.length(); i++) {
String num = phone.substring(0, i);
if(hm.containsKey(num)) {
return false;
}
}
}
return true;
}
}
앞서 배웠던 HashMap을 사용해서 문제를 풀었다.
HashMap에 있는 번호를 substring으로 잘라서 같은 번호가 있는지 검사하는 방식이다.
근데 HashMap<String, Integer>에서 key값으로 폰 번호를 넣었지만 Integer로 딱히 넣을 값이 없어서 좀 아쉬웠다. 그래서 밑에 코드는 새로 배운 HashSet을 사용해보았다.
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
Set <String> hs = new HashSet<>(Arrays.asList(phone_book));
for(String key: hs) {
for(int i=1; i<key.length(); i++) {
if(hs.contains(key.substring(0, i))) return false;
}
}
return true;
}
}
달라진 부분은 HashSet을 사용해서 key값만 저장했다는 점, 그리고 HashSet을 생성할 때 phone_book배열을 Arrays.asList()을 사용해 바로 저장했다.
containsKey() 대신 HashSet의 contains()를 사용해 값을 비교했다.
HashMap을 썼을 때 불필요했던 부분이 HashSet을 쓰면서 코드가 훨씬 좋아졌다.
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
Map<String, Integer> hm = new HashMap<>();
for(int i=0; i<clothes.length; i++){
hm.put(clothes[i][1], hm.getOrDefault(clothes[i][1], 0) + 1);
}
for(String key : hm.keySet()) {
answer *= hm.get(key)+1;
}
return answer-1;
}
}
옷에 대한 정보는 저장할 필요 없고 조합의 개수만 구하면 되는 문제이므로
HashMap에 옷의 종류와 해당 카테고리에 속한 옷의 개수를 저장했다.
아무것도 입지 않는 경우를 제외한 조합은 안입는 경우를 포함(+1)한 수를 각각 곱해준 뒤 1을 빼서 구했다.
해시맵을 어느정도 사용할 수 있게 된 것 같다 😆👍
import java.util.*;
class Solution {
static class Music{
String genre;
int play;
int idx;
public Music(String genre, int play, int idx){
this.genre = genre;
this.play = play;
this.idx = idx;
}
}
public int[] solution(String[] genres, int[] plays) {
Map<String, Integer> hm = new HashMap<>();
// genre, 총 재생 횟수
for(int i=0; i<genres.length; i++) {
hm.put(genres[i], hm.getOrDefault(genres[i], 0)+plays[i]);
}
// 재생 횟수 내림차순 정렬
List<String> keySetList = new ArrayList<>(hm.keySet());
Collections.sort(keySetList, (o1, o2) -> (hm.get(o2).compareTo(hm.get(o1))));
// 정렬된 장르 순서대로 배열의 장르와 비교
// 같다면 music 생성 후 list에 저장, 내림차순 정렬
// 최대 2개까지 playlist에 추가
ArrayList<Music> playlist = new ArrayList<>();
for(String genre : keySetList){
ArrayList<Music> list = new ArrayList<>();
for(int i=0; i<genres.length; i++){
if(genres[i].equals(genre)){
list.add(new Music(genre, plays[i], i));
}
}
Collections.sort(list, (o1, o2) -> o2.play - o1.play);
playlist.add(list.get(0));
if(list.size()>1) {
playlist.add(list.get(1));
}
}
// music에서 idx값 answer에 추가
int[] answer = new int[playlist.size()];
for(int i=0; i<playlist.size(); i++){
answer[i] = playlist.get(i).idx;
}
return answer;
}
}
이 문제는 정말정말 어렵게 풀었다... 한시간 반정도 걸렸던 것 같은데 그래도 풀긴 풀어서 만족스럽다!
처음에는 해시맵에 장르와 해당 장르에 포함된 플레이 수를 리스트로 저장했었는데 코드를 짜다보니 곡의 index의 정보가 누락되어서 점점 꼬이게 됐다 ㅜㅜ
그래서 Music이라는 클래스를 만들어서 안에 장르, 재생 횟수, 인덱스 값을 저장하게 했다.
해시맵에는 장르와 장르의 총 재생횟수를 저장하고 내림차순으로 정렬했다.
그래서 Genres배열을 해시맵의 키값과 비교해 최대 2개씩 추가 후 해당 곡의 index값을 answer에 추가했다.
코드를 짜면서 헷갈리다보니 주석을 적으면서 코드를 짜니까 좀 나았던 것 같다.
HashMap 클래스의 개념과 예제
이렇게 해서 해시 파트의 4문제를 모두 풀어보았는데 HashMap, HashSet, 그리고 getOrDefault라는 메서드를 알게되었다.
알고리즘 스터디를 하면서 서로의 코드를 공유하다보니 문제를 푸는 다양한 시각을 배우고 팁도 많이 배워서 되게 좋은 것 같다 🔥🔥