Algorithm

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

HONGNEW 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;
    }
}