<풀기 전 생각>

1. 필요한 튜플에 대한 정보가 주어진 문자열이 {}로 둘러싸인 구조 임으로 String의 indexOf() 함수를 사용하여 "{", "}" 중괄호의 인덱스를 일일이 구한 뒤 문자열의 배열로 분리

2. 그렇게 분리된 문자열 들을 Stream 클래스의 sort() 메서드를 통해 길이 순으로 정렬

3. Set을 사용하여 중복을 체크 하면서 튜플 생성

 

<중간 문제점>

 프로그래머스에서 Stream.toList() 메서드를 인식을 하지 않아서 고민 했었는데

import java.util.stream.Collectors;

.collect(Collectors.toList()); 다음 과 같은 방식으로 형태를 변환한 뒤 사용하니 해결 할 수 있었다.

<최종 코드>

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    // 시간 복잡도 O(n*m) 공간 복잡도 O(n)
    public int[] solution(String s) {
        ArrayList<String> units = new ArrayList<String>();
        // 업 캐스팅 자식 타입 객체가 부모 객체로 형변환
        List<String> sortedUnits = new ArrayList<String>();
        String tmp = s.substring(1,s.length()-1);
        // 괄호를 제거한 튜플의 각 원소들을 리스트 형태로 추출
        units = getUnits(tmp);
        // 문자열 길이에 따른 정렬
        sortedUnits=units.stream().sorted(Comparator.comparing(String::length)).collect(Collectors.toList());

        return makeTuple(sortedUnits);
    }
    // 시간 복잡도 O(1) 공간 복잡도 O(n)
    private ArrayList<String> getUnits(String s){
        ArrayList<String> ans = new ArrayList<String>();
        int frontBraCapIndex = 0;
        int beforeBraCapIndex = 0;
        while(true){
            frontBraCapIndex=s.indexOf("{",frontBraCapIndex);
            beforeBraCapIndex=s.indexOf("}",beforeBraCapIndex);
            if(frontBraCapIndex==-1||beforeBraCapIndex==-1) break;
            ans.add(s.substring((frontBraCapIndex++)+1,beforeBraCapIndex++));
        }
        return ans;
    }
    // 시간 복잡도 O(n*m) 공간 복잡도 O(n)
    private int[] makeTuple(List<String> sortedUnits){
        int tuple[] = new int[sortedUnits.size()];
        HashSet<Integer> duplicateChecker = new HashSet<Integer>();
        int tupleIndex = 0;
        for (String unit:sortedUnits) {
            String numArray[] = unit.split(",");
            for (String num: numArray) {
                int transNum = Integer.parseInt(num);
                if(!duplicateChecker.contains(transNum))
                    tuple[tupleIndex++]=transNum;
                duplicateChecker.add(transNum);
            }
        }
        //System.out.println("test");
        return tuple;
    }
}

 <메모>

나는 일일이 "{", "}"을 찾고 문자열을 분리시키는 생각을 하였는데 우수 풀이에서는 애초에 분리 시킬 때 방해가 되는 요소를 모두 삭제 후 분리 작업을 시행하였는데 내가 사용한 방법보다 좋은 방법인 것 같다.  

또한 Stream은 항상 느리다는 점을 감안하여 Arrays.sort() 메소드를 사용한 것도 인상 깊었다.

        String[] arr = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , ");
        Arrays.sort(arr, (a, b)->{return a.length() - b.length();});

 

'PS > Level2' 카테고리의 다른 글

[1차] 캐시  (0) 2023.02.08

+ Recent posts