인프런 강좌 유형별 정리 📋 String & Array 1탄

ims·2021년 2월 13일
0

알고리즘

목록 보기
23/23

📌 Anagram

String s = "123444a";

    int[] anagram = new int[256];

    for(int i=0;i<s.length();i++){
        anagram[s.charAt(i)]++;
    }

    for (int i : anagram) {
        System.out.print(i + " ");
    }

int 배열안에 들어가는 index가 int가 아니라 Char 이기 때문에

anagram[1] 여기에 값이 들어가는게 아니고
anagram['1'] 1인 Char 값이 들어가기 때문에 그 값에 맞는 index를 따라가는 것

📌 문자 Anagram

같은 문자열인지 확인하는 문제

public class AnagramTest {
    public static void main(String[] args) {
        String ab = "abcd";
        String ba = "badc";

        int[] check = new int[256];
        for(int i=0;i<ab.length();i++){
            check[ab.charAt(i)]++;
        }
        int[] baChecking = new int[256];
        for(int i=0;i<ab.length();i++){
            baChecking[ba.charAt(i)]++;
        }
        if(Arrays.equals(check, baChecking)){
            System.out.println("true");
        }
    }
}

🎯 output

true
  • String을 charAt을 활용하여 int 배열에 담는 것이 idea

📌 숫자 Anagram

두 배열에서 같은 숫자의 index를 반환

public class FindAnagramMapping {
    public static void main(String[] args) {
        int[] a = {11,27,1,324,12};
        int[] b = {27,11,324,12,1};

        int[] result = solution(a,b);
        for (int i : result) {
            System.out.print(i + " ");
        }
    }

    private static int[] solution(int[] a, int[] b) {
        int [] result = new int[a.length];

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

        for(int i=0;i<a.length;i++){
            map.put(b[i],i);
        }
        for(int i=0;i<a.length;i++){
            result[i] = map.get(a[i]);
        }
        return result;
    }
}

🎯 output

1 0 4 2 3
  • Map을 활용 Map에 value,index 를 넣고, Map.get(value) 하면 index가 가져와 질 것

📌 같은 문자끼리 묶는 Anagram

public class ScratchPad {
    public static void main(String[] args) {

        String[] list = {"eat","tea","tan","ate","nat","bat"};
        System.out.println(solution(list));
    }

    private static List<List<String>> solution(String[] list) {
        /*
        list -> char
        char sorting
        sorting 한 값이 같으면 추가
        같은 값 = map
         */
        Map<String,List<String>> map = new HashMap();
        List<List<String>> result = new ArrayList<>();

        for(String s : list){
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String sortingString = String.valueOf(chars);
            System.out.println(sortingString);
            System.out.println(" ==== ");

            if(map.containsKey(sortingString)){
                map.get(sortingString).add(sortingString);
            }else{
                List<String> stringList = new ArrayList<>();
                stringList.add(s);
                map.put(sortingString,stringList);
            }
        }
        result.addAll(map.values());
        return result;
    }
}

🎯 output

[[eat, aet, aet], [bat], [tan, ant]]
  • 함수 들어가기 전에 위처럼 주석 달아놓고 풀이 들어가는게 좋다

String sortingString = String.valueOf(chars);

이 부분에서 밑에처럼 잘못 생각할 수 있다.

String sortingString = Arrays.toString(chars);
// output : [a,e,t] , [a,n,t] ....
String sortingString = chars.toString();
// output : 주소값 ( @[C@27d6c5e0 ) 
Map<String,List<String>> map = new HashMap();

이거를 for loop 안에서 선언하는 실수를 했음

  • 마지막에 값 추가는 result.addAll() 로 한다.

🔥 자꾸 기억에 의존해서 문제를 풀려고 한다. 나의 사고에 자신이 없기 때문. 그냥 내 생각대로 쭉 해봐도 된다.

📌 Priority Queue

🎯 문제

두 번째로 큰 숫자?

  • Arrays.sort로 풀어도 되지만, Priority Queue 를 활용해보자.
public class KthLargestElementInAnArray {
    public static void main(String[] args) {

        Comparator<Integer> comp = (o1, o2) -> o1-o2;

        int[] arrays = {4,2,1,5,7,10,232};

        PriorityQueue<Integer> pq = new PriorityQueue<>(comp);

        for (Integer i :arrays) {
            pq.offer(i);
            if(pq.size()>=3){
                pq.poll();
            }
        }

        System.out.println(pq.peek());
    }
}

🔥 idea

priority queue 의 comparator를 정의 해놓고, queue.size() 가 3이 넘어가면 poll을 해서 2개를 유지한다. 오름차순으로 정의해놨으므로

  • 두번째로 큰놈 - 첫번째로 큰놈

이런 식으로 존재할 것이다.

📌 StringBuilder 문제

🎯 output

🎯 intput : "8F3Z-2e-9-wadwqdas"
🎯 output : 8F3-Z2E9-WADW-QDAS

🔥 idea

  1. String 추가할 때 StringBuilder를 활용하면 편하다.

  2. 추가는 append, 인덱스에 추가는 insert를 활용한다.

for(int i=k;i<length;i=i+k){
	sb.insert(length-i,"-");
}

뒤에서부터 추가하는 for loop 아이디어

   String str = "8F3Z-2e-9-wadwqdas";
        int k=5;
        String solution = solution(str, k);
        System.out.println(solution);

    }

    private static String solution(String str, int k) {
        StringBuilder sb = new StringBuilder();

        String replace = str.replace("-", "");
        String s = replace.toUpperCase();
        int length = s.length();

        for(int i=0;i<length;i++){
            sb.append(s.charAt(i));
        }

        for(int i=k;i<length;i=i+k){
            sb.insert(length-i,"-");
        }
        String s1 = String.valueOf(sb);
        return s1;
    }

📌 구간 합 최대

🎯 output

🎯 input : int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
🎯 output : 6

🔥 idea

sum = Math.max(loop[i], sum+loop[i])
max = Math.max(max,sum)

sum = 현재의 최대치 계산
max = 지금까지의 최대치 저장


public class MaximumSubArray {
    public static void main(String[] args) {
        int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
        System.out.println(solution(nums));
    }
    public static int solution(int nums[]){
        int newSum = nums[0];
        int max = nums[0];

        for(int i=1;i<nums.length;i++){
            newSum = Math.max(nums[i],newSum+nums[i]);
            max = Math.max(newSum,max);
        }
        return max;
    }
}
profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글