본문 바로가기
알고리즘 문제풀이/프로그래머스

[프로그래머스] 튜플 - 자바(Java), 2019 카카오 개발자 겨울 인턴십

by jeonghaemin 2021. 10. 22.
728x90

문제

https://programmers.co.kr/learn/courses/30/lessons/64065

풀이 코드

주어진 집합을 길이를 기준으로 오름차순으로 정렬하여 길이가 제일 짧은 집합부터 순차적으로 모든 집합의 원소들을 순서를 유지하면서 중복을 허용하지 않는 LinkeHashSet에 add 해주면 튜플이 만들어지고 배열로 변환하여 반환하면 된다.

import java.util.*;

class Solution {
    public int[] solution(String s) {
        List<String> list = new ArrayList<>();

        //괄호를 제거하여 각 집합을 숫자와 ,로 이루어진 문자열로 만든다.
        int start = 2;
        for(int end = 2; end < s.length()-1; end++) {
            if(s.charAt(end) == '}'){
                list.add(s.substring(start, end));
                start = end+3;
            }
        }

        //집합을 길이를 기준으로 오름차순으로 정렬한다.
        Collections.sort(list, (s1, s2) -> s1.length() - s2.length());

        //중복을 허용하지 않는 Set 자료구조를 사용하여 튜플을 만든다.
        //순서를 유지해야하기 떄문에 LinkedHashSet 사용
        Set<Integer> set = new LinkedHashSet<>();

        //집합의 원소들을 차례대로 set에 add한 결과는 튜플이다.
        for(String str : list) {
            StringTokenizer st = new StringTokenizer(str, ",");

            while(st.hasMoreTokens()) {
                set.add(Integer.parseInt(st.nextToken()));
            }
        }

        //반환 타입이 배열이기 때문에 set을 배열로 변환하여 반환한다. 
        List<Integer> temp = new ArrayList<>(set);
        int[] answer = new int[temp.size()];

        for(int i = 0; i < temp.size(); i++) {
            answer[i] = temp.get(i);
        }

        return answer;
    }
}

참고

문자열의 괄호를 제거하여 각 집합을 숫자와 ,로 이루어진 문자열로 만드는 코드는 정규표현식을 사용하여 작성할 수도 있다.

import java.util.*;

class Solution {
    public int[] solution(String s) {
        //괄호를 제거하여 각 집합을 숫자와 ,로 이루어진 문자열로 만든다.
        String[] arr = s.replaceAll("[{}]", " ").trim().split(" , ");

        //집합을 길이를 기준으로 오름차순으로 정렬한다.
        Arrays.sort(arr, (s1, s2) -> s1.length() - s2.length());

      ...
    }
}

댓글