robert-min / dev-blog

김민준 - project 정리한 repo입니다.
0 stars 0 forks source link

231112 - 해시 : HashMap 사용, ArrayList 특정값 확인, HashMap 크기, 배열 안의 문자 길이로 정렬, substring, startsWith, 정렬 활용, ArrayList 객체 int[]배열로 변환 #102

Open robert-min opened 10 months ago

robert-min commented 10 months ago
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        // HashMap으로 저장
        HashMap<String, Integer> map = new HashMap<>();
        for (String player: participant) {
            // map.getOrDefault : 값이 있으면 값, 없으면 defaultValue
            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();

        // iter.hasNext : 다음 객체가 있는 지확인
        while (iter.hasNext()) {
            Map.Entry<String, Integer> entry = iter.next();
            if (entry.getValue() != 0) {
                answer = entry.getKey();
                break;
            }
        }
        return answer;

두 배열 정렬 후 값 비교

}


## ArrayList 특정값 확인, 삭제 (시간초과)

```java
iimport java.util.*;

public class Main {

    /*
    Return : 완주하지 못한 선수 이름
    - 동명이인
    */
    public String solution(String[] participant, String[] completion) {
        String answer = "";

        List<String> strArray = new ArrayList<>(Arrays.asList(participant));

        for (String str: completion) {
             if (strArray.contains(str)) {
                 strArray.remove(str);
             }
        }

        answer = strArray.get(0);

        return answer;
    }

    public static void main(String[] args) {
        String[] part = {"leo", "kiki", "eden"};
        String[] comp = {"eden", "kiki"};
        Main sol = new Main();
        System.out.println(sol.solution(part, comp));
    }
}
robert-min commented 10 months ago

참고. iterator 값 수정 예시

import java.util.ArrayList;
import java.util.ListIterator;

public class Main
{
    public static void main(String[] args)
    {
        // 컬렉션 생성
        ArrayList<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        list.add("E");
        list.add("F");
        System.out.println("while문 지나기 전 리스트에 들어있던 값 : " + list);

        // 리스트에 들어있는 값에 각각 '+' 붙이기
        ListIterator<String> listIterator = list.listIterator();
        while(listIterator.hasNext())
        {
            Object element = listIterator.next();
            listIterator.set(element + "+");
        }
        System.out.println("while문 지난 후 수정된 결과 : " + list);

        // 리스트에 들어있는 값을 역순으로 표시
        System.out.print("역순 출력 결과 : ");
        while(listIterator.hasPrevious())
        {
            Object element = listIterator.previous();
            System.out.print(element + " ");
        }
        System.out.println();
    }

}
// >> while문 지나기 전 리스트에 들어있던 값 : [A, B, C, D, E, F]
// >> while문 지난 후 수정된 결과 : [A+, B+, C+, D+, E+, F+]
// >> 역순 출력 결과 : F+ E+ D+ C+ B+ A+
robert-min commented 10 months ago

HashMap 크기 활용

import java.util.*;

class Solution {
    public int solution(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        int size = map.size();
        if (size >= (nums.length / 2)) {
            return nums.length / 2;
        } else {
            return size;
        }
    }
}
robert-min commented 10 months ago

참고. 배열 안의 문자 길이로 정렬

// 문자 길이로 정렬
Arrays.sort(phone_book, (String s1, String s2) -> s1.length() - s2.length());
robert-min commented 10 months ago

HashMap 풀이

import java.util.*;
class Solution {
    /*
    Return : 어떤 번호가 다른 번호의 접두어가 있으면 false, 없으면 true
    */
    public boolean solution(String[] phone_book) {

        Map<String, Integer> map = new HashMap<>();

        // 모든 전화번호를 HashMap
        for (int i = 0; i < phone_book.length; i++) {
            map.put(phone_book[i], i);
        }

        for (int i = 0; i < phone_book.length; i++) {
            for (int j = 0; j < phone_book[i].length(); j++) {
                // key의 substring을 출력하여 HashMap에 존재하는지 확인
                if (map.containsKey(phone_book[i].substring(0, j))) return false;
            }
        }
        return true;

    }
}

startsWith 활용

import java.util.*;
class Solution {
    /*
    Return : 어떤 번호가 다른 번호의 접두어가 있으면 false, 없으면 true
    */
    public boolean solution(String[] phone_book) {

        Arrays.sort(phone_book);
        for (int i = 0; i < phone_book.length - 1; i++) {
            // str1.startsWith(str2) : str1이 str2로 시작되면 True
            if (phone_book[i+1].startsWith(phone_book[i])) return false;
        }
        return true;
    }
}
robert-min commented 10 months ago

의상 경우의 수

class Solution { / Return : 어떤 번호가 다른 번호의 접두어가 있으면 false, 없으면 true / public int solution(String[][] clothes) { int answer = 1; Map<String, Integer> map = new HashMap<>();

    for (String[] cloth : clothes) {
        map.put(cloth[1], map.getOrDefault(cloth[1], 0) + 1);
    }

    Iterator<Integer> iter = map.values().iterator();

    while (iter.hasNext()) {
        answer *= iter.next() + 1;
    }
    // 아무것도 입지 않는 경우 제외
    return answer - 1;
}

}

robert-min commented 10 months ago

https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java

베스트앨범 - 정렬 활용, ArrayList 객체 int[]배열로 변환

import java.util.*;

class Music {
    int idx;
    int count;

    public Music(int idx, int count) {
        this.idx = idx;
        this.count = count;
    }
}

class Solution {

    /*
    Return : 노래의 고유 번호 순서대로
    - 장르 별 가장 많이 재생된 노래 2개, 1개만 있을 경우 1개만
    - 장르 별 전체 재생 수가 많은 -> 장르 안에 재생 수가 많은 -> 장르의 고유 번호가 높은
    */
    public int[] solution(String[] genres, int[] plays) {
        ArrayList<Integer> answer = new ArrayList<>();
        HashMap<String, Integer> map = new HashMap<>();
        for (int i = 0; i < genres.length; i++) {
            map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
        }

        // 가장 많이 플레이된 장르
        ArrayList<String> mapToGenres = new ArrayList<>();
        // key 값을 추출 한 후 value 기준으로 내림차순 정렬
        for (String item : map.keySet()) {
            mapToGenres.add(item);
        }
        mapToGenres.sort(((o1, o2) -> map.get(o2) - map.get(o1)));

        // 장르 내에서 가장 많이 들은 노래
        for (String item : mapToGenres) {
            // 장르별 재생 횟수를 저장할 ArrayList 생성
            ArrayList<Music> music = new ArrayList<>();
            for (int i = 0; i < genres.length; i++) {
                if (item.equals(genres[i])) {
                    music.add(new Music(i, plays[i]));
                }
            }

            music.sort(new Comparator<Music>() {
                @Override
                public int compare(Music o1, Music o2) {
                    // count가 같을 경우 idx 오름 차순
                    if (o1.count == o2.count) {
                        return o1.idx - o2.idx;
                    }
                    // count 내림 차순
                    return o2.count - o1.count;
                }
            });

            // 장르별로 저장(최대 2개)
            answer.add(music.get(0).idx);
            if (music.size() != 1) {
                answer.add(music.get(1).idx);
            }
        }
        // int[] 배열로 변환
        return answer.stream().mapToInt(i -> i).toArray();

    }

}