ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 튜플(2019 카카오 개발자 겨울 인턴십
    Algorithm 2021. 1. 10. 14:35

     

     

    프로그래머스에서 2019 카카오 인턴 코테 출제 문제인 튜플을 풀어봤습니다.

     

     

    이 문제는 예전에 한번 풀었었는데 시간이 많이 지나 기억이 잘 나지 않아서 정리도 할 겸 다시 한번 풀어봤습니다.

    당시에 문제 자체를 잘못 이해해서 애먹었던 기억이 나네요ㅎㅎ,,,

     

    순서가 정해진 튜플을 바탕으로 만들어진 집합 배열이 주어지고, 이 배열을 통해 어떤 튜플인지를 찾으면 되는 문제입니다.

    이 문제를 풀 때 고려해야할 것들은 다음과 같습니다.

     

    1. 문자열 처리

    2. 길이 순 정렬 조건

    3. 중복 제거

     

     

    1. 문자열 처리

    주어진 문자열을 '{ }'를 기준으로 잘라줍니다.

    아래 두 가지 방법으로 구현해보았습니다.

    * StringBuffer를 이용해 괄호가 시작되고 끝날 때까지의 데이터를 뽑아 배열에 넣어줍니다.

    	StringBuffer sb = new StringBuffer();
            boolean flag = false;
            for(int i=1; i<s.length()-1; i++){
                if(s.charAt(i)=='{'){
                    flag = true;
                    continue;
                }else if(s.charAt(i)=='}'){
                    String str = sb.toString();
                    String[] array = str.split(",");
                    list.add(array);
                    sb.delete(0, sb.toString().length());
                    flag = false;
                }else if(flag){
                    sb.append(s.charAt(i));
                }
            }

    * 문자열의 '{ }'를 replaceAll() 메소드를 통해 다른 문자로 변경해주고, split() 메소드를 이용해 배열로 변환합니다.

    String[] arr2 = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , ");

     

    2. 길이순 정렬 조건

    문자열 배열을 길이에 대해 오름차순으로 정렬합니다.

    ArrayList를 사용한 경우 Collections.sort() 메소드를 이용해 Comparator객체를 생성해 다음과 같이 정렬할 수 있습니다.

    Collections.sort(list, new Comparator<String[]>(){
            @Override
                public int compare(String[] o1, String[] o2){
                    if(o1.length>o2.length) return 1;
                    return -1;
                }
            });

    배열을 사용한 경우 Arrays.sort() 메소드를 이용해 다음과 같이 정렬할 수 있습니다.

    Arrays.sort(arr2, (a, b)->{return a.length() - b.length();});

     

    3. 중복 제거

    각 배열을 탐색하면서 set에 넣어주고, set에 이미 들어있는 데이터를 제외하면서 튜플 값을 찾아줍니다.

    ArrayList를 사용한 경우 다음과 같이 반복문을 실행해 result List에 데이터를 넣어줍니다.

    HashSet<String> hset = new HashSet<>();
            for(int i=0; i<list.size(); i++){
                String[] arr = list.get(i);
                for(int j=0; j<arr.length; j++){
                    if(hset.add(arr[j])) result.add(arr[j]);
                }
            }

    배열을 사용한 경우 다음과 같이 반복문을 실행해 result List에 데이터를 넣어줍니다.

    for(String str1 : arr2){
                for(String str2 : str1.split(",")){
                    if(hset.add(str2)) result.add(str2);
                }
            }

     

     

    전체 코드

    import java.util.*;
    class Solution {
        public int[] solution(String s) {
            int[] answer;
            ArrayList<String[]> list = new ArrayList<>();
            ArrayList<String> result = new ArrayList<>();
            
            StringBuffer sb = new StringBuffer();
            boolean flag = false;
            for(int i=1; i<s.length()-1; i++){
                if(s.charAt(i)=='{'){
                    flag = true;
                    continue;
                }else if(s.charAt(i)=='}'){
                    String str = sb.toString();
                    String[] array = str.split(",");
                    list.add(array);
                    sb.delete(0, sb.toString().length());
                    flag = false;
                }else if(flag){
                    sb.append(s.charAt(i));
                }
            }
            Collections.sort(list, new Comparator<String[]>(){
            @Override
                public int compare(String[] o1, String[] o2){
                    if(o1.length>o2.length) return 1;
                    return -1;
                }
            });
            HashSet<String> hset = new HashSet<>();
            for(int i=0; i<list.size(); i++){
                String[] arr = list.get(i);
                for(int j=0; j<arr.length; j++){
                    if(hset.add(arr[j])) result.add(arr[j]);
                }
            }
            answer = new int[result.size()];
            for(int i=0; i<result.size(); i++){
                answer[i] = Integer.parseInt(result.get(i));
            }
            return answer;
        }
    }
    import java.util.*;
    class Solution {
        public int[] solution(String s) {
            int[] answer;
            ArrayList<String> result = new ArrayList<>();
            
            String[] arr2 = s.replaceAll("[{]", " ").replaceAll("[}]", " ").trim().split(" , ");
            Arrays.sort(arr2, (a, b)->{return a.length() - b.length();});
            
            HashSet<String> hset = new HashSet<>();
            for(String str1 : arr2){
                for(String str2 : str1.split(",")){
                    if(hset.add(str2)) result.add(str2);
                }
            }
            answer = new int[result.size()];
            for(int i=0; i<result.size(); i++){
                answer[i] = Integer.parseInt(result.get(i));
            }
            return answer;
        }
    }

     

Designed by Tistory.