섹션2. 해싱 & 시간 파싱 알고리즘 - (1)

728x90

🎈섹션2. 해싱 & 시간 파싱 알고리즘 - (1)

🟦 2-1. 한 번 사용한 최초 문자

코드

  • HashMap<문자, 빈도수> 저장해야 한다.
  • map.getOrDefault() 사용해서 문자가 중복없이 카운팅 되도록 해야 함
  • 다시 i로 전체 길이 순회하면서 i번째 문자(key) 기준으로 get 한 value가 1인 경우 해당 i+1을 곧장 리턴해주어야 한다.
// 2-1. 한 번 사용한 문자 
import java.util.*;
class Solution1 {
    //솔루션 함수 
    public int solution(String s){
        //각 문자, 빈도수 
        HashMap<Character, Integer> map = new HashMap<>();
        //각 문자별 빈도수 카운팅
        for(char x : s.toCharArray()) {
            //맵에 담되, 중복 없이 담음 
            map.put(x, map.getOrDefault(x, 0) + 1);
        }

        //i를 길이만큼 순회하면서
        for(int i=0; i<s.length(); i++) {
            //만약 맵에 각 i번째 문자 (key)값 기준으로 value를 가져왔더니 1이면 리턴함
            if(map.get(s.charAt(i)) == 1) return i+1;
        }

        return -1;
    }
    //실행 메인
    public static void main(String[] args){
        Solution1 T = new Solution1();
        System.out.println(T.solution("statitsics"));
        System.out.println(T.solution("aabb"));
        System.out.println(T.solution("stringshowtime"));
        System.out.println(T.solution("abcdeabcdfg"));
    }
}

🟦 2-2. 같은 빈도수 만들기

첫 시도

  • map.get(s.charAt(i)) 로 값을 가져오면 안됨
  • map.getOrDefault(key, 0) 으로 가져와야 없는 문자도 0으로 뽑아옴
  • abcde 순서대로 필요한 개수 가져와야 하므로 tmp를 만들었어야 함 ..
/* 2-2. 같은 빈도수 만들기 */
import java.util.*;
class Solution2 {
    //솔루션 함수 
    public int[] solution(String s){
        int[] answer = new int[5];
        HashMap<Character, Integer> map = new HashMap<>();
        //일단 담고 카운팅 
        for(char x: s.toCharArray()) {
            map.put(x, map.getOrDefault(x, 0)+1);
        }
        int max = Integer.MIN_VALUE;
        //전체 탐색하면서 max 길이만틈 담고  
        for(int i=0; i<s.length(); i++) {
            if(max < map.get(s.charAt(i))) max = s.charAt(i);
        }

        //빈도수 맞지 않는 애들에 대하여.
        for(int i=0; i<s.length(); i++) {
            if(map.get(s.charAt(i)) != max) {
                //최대 - 기존값
                int tmp = map.get(s.charAt(i));
                answer[i] = max- tmp;
            }
            answer[i] = 0;
        }

        return answer;
    }
    //실행 메인 
    public static void main(String[] args){
        Solution2 T = new Solution2();
        System.out.println(Arrays.toString(T.solution("aaabc")));
        System.out.println(Arrays.toString(T.solution("aabb")));
        System.out.println(Arrays.toString(T.solution("abcde")));
        System.out.println(Arrays.toString(T.solution("abcdeabc")));
        System.out.println(Arrays.toString(T.solution("abbccddee")));
    }
}

완성 코드

/* 2-2. 같은 빈도수 만들기 */
import java.util.*;
class Solution2 {
    //솔루션 함수 
    public int[] solution(String s){
        int[] answer = new int[5];
        HashMap<Character, Integer> map = new HashMap<>();
        //일단 담고 카운팅 
        for(char x: s.toCharArray()) {
            map.put(x, map.getOrDefault(x, 0)+1);
        }

        int max = Integer.MIN_VALUE;
        //이 순서대로 answer 담아야 하므로 
        String tmp = "abcde";

        for(char key : tmp.toCharArray()) {
            //없는 문자가 있어도 기본으로 0이라도 반환함 
            if(map.getOrDefault(key, 0) > max) {
                max = map.getOrDefault(key, 0);
            }
        }
        //정답 세팅 
        for(int i =0; i<tmp.length(); i++) {
            //맵 내부 순회하면서 abcde 순서대로 각 (max-빈도수)필요한 추가 개수 가져오되
            // 없으면 0 반환하도록 
            answer[i] = max - map.getOrDefault(tmp.charAt(i), 0);
        }
        return answer;    
    }
    //실행 메인 
    public static void main(String[] args){
        Solution2 T = new Solution2();
        System.out.println(Arrays.toString(T.solution("aaabc")));
        System.out.println(Arrays.toString(T.solution("aabb")));
        System.out.println(Arrays.toString(T.solution("abcde")));
        System.out.println(Arrays.toString(T.solution("abcdeabc")));
        System.out.println(Arrays.toString(T.solution("abbccddee")));
    }
}

728x90