프로그래머스 알고리즘 문제 풀이 - 정렬

zio도미닉·2022년 1월 8일
0

1. K번째수

알게 된 점
배열의 처음과 끝에 인덱스를 찾고 싶을때? copyOfRange(원본배열, 시작 인덱스, 끝 인덱스)

int []origin={1,2,3,4,5}
int []arr=Arrays.copyOfRange(origin,2,4) // 3,4 출력
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
    
        
        for (int i=0;i<commands.length;i++) {
            int start=commands[i][0]-1;
            int end=commands[i][1];
            int find=commands[i][2];
            
            // System.out.println("end:"+end);
            // System.out.println(Arrays.toString(commands[i]));
            int[]arr=Arrays.copyOfRange(array,start,end);
            Arrays.sort(arr);
            // System.out.println(Arrays.toString(arr));
            
            int value=arr[find-1];
            // System.out.println(value);
            answer[i]=value;
            
        }
        
        
        return answer;
    }

2. 가장 큰 수

Arrays.sort와 Collections.sort의 차이

1. Arrays.sort -> 배열을 정렬할때 사용, Wrapper클래스 (Integer, String 배열 등의 정렬을 정렬하고 싶을때 사용)

    public static void main(String[] args) {

        // Arrays.sort정렬은 -> Wrapper class를 사용해야 함 (int 안됨)
        Integer nums[]={3,100,5,2,4,7,8};
        // 기본 정렬 (오름차순)
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums)); // [2, 3, 4, 5, 7, 8, 100]

        // 내림차순으로 정렬
        // 1. 람다를 이용한 방법 -> 숫자는 compareTo를 사용
        Arrays.sort(nums,(o1,o2)->(o2).compareTo(o1));
        System.out.println(Arrays.toString(nums)); // [100, 8, 7, 5, 4, 3, 2]
        // 2. Collections.reverseOrder()를 이용한 방법
        Arrays.sort(nums,Collections.reverseOrder()); 
        System.out.println(Arrays.toString(nums)); // [100, 8, 7, 5, 4, 3, 2]

        // 문자 정렬
        String strNums[]={"3","100","1","500","8","200"};
        Arrays.sort(strNums); // 오름차순 정렬
        System.out.println(Arrays.toString(strNums));  // [1, 100, 200, 3, 500, 8] -> 사전순으로 정렬됨

        Arrays.sort(strNums,(o1,o2)->(o2).compareTo(o1)); // 내림차순 정렬
        System.out.println(Arrays.toString(strNums)); // [8, 500, 3, 200, 100, 1]

        // 가장 큰 수를 구하고 싶을때
        Arrays.sort(strNums,(o1,o2)->(o2+o1).compareTo(o1+o2));
        System.out.println(Arrays.toString(strNums)); // [8, 500, 3, 200, 1, 100]

        
    }

2. Collections.sort() -> arraylist를 정렬하고 싶을때 사용, arraylist에는 class도 들어갈 수 있음

package programmers.sort;
import java.util.*;
public class CollectionsSort {
    static class Coffee {
        int price;
        String name;

        public int getPrice() {
            return this.price;
        }

        Coffee(int price, String name) {
            this.price=price;
            this.name=name;
        }

    }

    public static void main(String[] args) {
        // Collections Sort -> arraylist를 정렬하고 싶을대 사용
        // 1. 숫자 정렬
        List<Integer>arrayList=Arrays.asList(22,44,11,33);

        Collections.sort(arrayList); // 오름차순 정렬
        System.out.println(arrayList.toString()); // [11, 22, 33, 44]

        Collections.sort(arrayList,(o1,o2)->o2.compareTo(o1)); // 내림차순 정렬
        System.out.println(arrayList.toString()); // [44, 33, 22, 11]

        // 2. 문자 정렬
        List<String>strList=Arrays.asList("22","44","11","555");
        Collections.sort(strList);
        System.out.println(strList.toString());

        Collections.sort(strList,(o1,o2)->o2.compareTo(o1));
        System.out.println(strList.toString());

        // 3. class 정렬
        List<Coffee>classList=new ArrayList<>();
        classList.add(new Coffee(100,"americano"));
        classList.add(new Coffee(5,"tea"));
        classList.add(new Coffee(500,"coffee"));
        classList.add(new Coffee(1,"bread"));

        // 3-1. int에 의해 정렬될때는 -를 이용
        Collections.sort(classList,(o1,o2)-> o1.getPrice()-(o2.getPrice())); // 오름차순 정렬
        for (Coffee coffee:classList) {
            System.out.println(coffee.name+" "+coffee.getPrice());
        }

        /*
           class의 숫자에 의한 오름차순 정렬
            bread 1
            tea 5
            americano 100
            coffee 500
         */
        
        System.out.println("=====================");

        Collections.sort(classList,(o1,o2)-> o2.getPrice()-(o1.getPrice())); // 내림차순 정렬
        for (Coffee coffee:classList) {
            System.out.println(coffee.name+" "+coffee.getPrice());
        }
        /*
           class의 숫자에 의한 내림차순 정렬
            coffee 500
            americano 100
            tea 5
            bread 1
         */
        

        System.out.println("=====================");

        // 3-2. 문자에 의한 정렬
        Collections.sort(classList,(o1,o2)->(o1.name).compareTo(o2.name)); // 오름차순 정렬
        for (Coffee coffee:classList) {
            System.out.println(coffee.name+" "+coffee.getPrice());
        }
        
        /*
           class의 문자에 의한 오름차순 정렬
            americano 100
            bread 1
            coffee 500
            tea 5
         */
        

        System.out.println("=====================");
        Collections.sort(classList,(o1,o2)->(o2.name).compareTo(o1.name)); // 내림차순 정렬
        for (Coffee coffee:classList) {
            System.out.println(coffee.name+" "+coffee.getPrice());
        }
        /*
           class의 문자에 의한 내림차순 정렬
            tea 5
            coffee 500
            bread 1
            americano 100
         */
        
    }
}

문제 해결

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        ArrayList<String>arraylist=new ArrayList<>();
        
        for (int i:numbers) {
            arraylist.add(Integer.toString(i));
        }
        
        // Collections.sort로 정렬
        Collections.sort(arraylist,(o1,o2)->(o2+o1).compareTo(o1+o2));
        
        // answer에 넣기
        // System.out.println(arraylist);
        if (arraylist.get(0).equals("0")) return "0";
        
        for (String s:arraylist) {
            answer+=s;
        }
    
        return answer;
    }
}

HashMap의 value기준 정렬

// HashMap 입력
for (int i=0;i<genres.length;i++) {
            String key=genres[i];
            int value=plays[i];
            genre.put(key,genre.getOrDefault(key,0)+value);
}

// value 기준으로 오름차순 정렬
// value 기준으로 오름차순하기 위해서는 key에 대한 arraylist를 만들어야 함.
List<String>arraylist=new ArrayList<>(genre.keySet());

// 정렬
Collections.sort(arraylist,(o1,o2)->genre.get(o2).compareTo(genre.get(o1)));
System.out.println(genre.toString());
profile
BackEnd Developer

0개의 댓글