알고리즘/java

<java> Orderly Queue

잼추 2024. 5. 27. 15:10

https://leetcode.com/problems/orderly-queue/

문제를 보자마자 든 생각은 첫번째 예시인
s = acb, k =1는

왜 답이 abc가 되지 않는가 였다

 

생각해보니 k가 1일때는 하나씩 회전하기 때문에

하나씩 제일 앞 글자를 빼서 제일 뒤에 넣는 것을 반복한 후

비교하면 된다고 생각하였다.

 

그러면 k가 2 이상일 때는 모든 글자가 사전순인

최선의 결과를 얻을 수 있을 것이라 생각했고

올바른 접근이라 판단하고 문제를 풀었다.

 

 sort, priorityQueue, Deque 모든 것을 다 사용해 보려고 노력 하였고

특히 반복문으로 쉽게 구현 할 수도 있지만

최대한 stream을 사용해서 간결하게 코드를 작성하고자 노력하였다.



stream 사용 예시 (String[] -> String)

	answer = Arrays.asList(str).stream().collect(Collectors.joining());

 

Collectors 사용

List<String> result = sampleList .stream().collect(toList());
Set<String> result = sampleList.stream().collect(toSet());
List<String> lists = sampleList.stream().collect(toCollection(LinkedList::new));
Set<String> sets = sampleList.stream().collect(toCollection(TreeSet::new));

String result = sampleList.stream().collect(Collectors.joining());
String result = sampleList.stream().collect(Collectors.joining(" ","PRE-", "-POST"));// join응용
//result = "PRE-a bb ccc dddd a-POST"

Long result = sampleList.stream().collect(counting());
Double result = sampleList.stream().collect(averagingDouble(String::length));
Optional<String> result = sampleList.stream().collect(maxBy(Comparator.naturalOrder()));

Map<Integer, Set<String>> result = sampleList.stream()
.collect(groupingBy(String::length, toSet()));// 기준 함수, Collector
// result => {1=[a], 2=[bb], 3=[ccc], 4=[dddd]}

 

 

<정답>

import java.util.*;
import java.io.*;

class Solution {
    public String orderlyQueue(String s, int k) {
        String answer = "";
        int length = s.length();
        if(k == 1){
            PriorityQueue<String> pq = new PriorityQueue<String>();
            Deque<String> str = new LinkedList<String>(Arrays.asList(s.split("")));
            for(int i = 0; i< length; i++){
                str.add(str.poll());
                pq.add(str.stream().collect(Collectors.joining()));
            }
            return pq.peek();
        }else{
            String[] str = s.split("");
            Arrays.sort(str);
            answer = Arrays.asList(str).stream().collect(Collectors.joining());
            return answer;
        }
    }
}