[프로그래머스,Level 2] 튜플 (JAVA 구현)
코테/프로그래머스(Programmers)

[프로그래머스,Level 2] 튜플 (JAVA 구현)

반응형

- 첫 풀이 및 정답풀이

  이 문제는 튜플에 속하는 원소들이 주어져 그것을 바탕으로 튜플을 구하는 것인 문제이다. 입출력 예제 1번을 통해 살펴보면, [2, 1, 3, 4]라는 튜블이 있을 때 이 튜블에 속하는 원소는 가장 앞에 있는 숫자부터 차례대로 붙여나가면 된다. 

즉, 첫 번째 원소는 가장 앞에 있는 {2}/ 두 번째 원소는 앞선 원소와 그다음 숫자인 {2,1}/ 세 번째 원소는 {2, 1, 3}/ 네 번째 원소는 {2, 1, 3, 4}가 된다. 

 

  단, 주의해야 할 점은 튜블 원소 내의 숫자들의 위치는 바뀔 수 있다는 점이다. 위의 세 번째 원소를 예로 들면, {1, 3, 2}도 튜플의 원소가 될 수 있다. 

 

  튜플의 원소들은 뒤로갈수록 길어지는 특징이 있기 때문에, 원소들의 길이를 기준으로 정렬한 뒤 가장 짧은 원소부터 고려하며 튜플을 채워나가면 된다. 필자는 여기까지 생각이 되었지만 문자열 가공에 대한 경험이 적어 완전히 해결하지 못해 이 부분을 다른 분들의 풀이를 참고했다.


  문제에서 주어지는 튜플의 원소 집합은 {{~}, {~}}와 같은 형태이다. 우리가 고려해야 하는 것은 큰 중괄호 안에 있는 중괄호들이기 때문에, 가장 앞의 {{ 와 가장 뒤의 }}는 필요가 없는 부분이다. 이를 String 클래스의 substring()메소드로 제거하면 ~}, {~}, {~와 같은 형태의 문자열이 남게 된다.

 

  이제 남은 },{ 의 문자열을 별도의 문자열로 replace()한 뒤, 해당 문자열로 split()을 해주면, 문자열 배열 형태로 분리가 가능하다. 단, 튜플의 원소 내에도 ,로 각 정수들이 구분되어 있으므로 분리된 문자열에 대해서도 split()을 수행하여 각 숫자들을 뽑아낼 수 있다. 마지막으로 ArrayList 클래스에서 제공하는 contains()메소드를 이용해 조건에 따라 원소들을 ArrayList에 담아주면 된다.

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Arrays;

class Solution {
    
    public ArrayList<Integer> solution(String s) {
        
        // 1. 튜플을 만들 ArrayList 객체.
        ArrayList<Integer> answer = new ArrayList<>();
        // 2. 가장 앞의 {{ 를 제거한다.
        s = s.substring(2,s.length());
        // 3. 가장 뒤의 }} 를 제거한 뒤, },{ 형태의 문자열을 -로 바꾼다.
        s = s.substring(0,s.length()-2).replace("},{","-");
        // 4. 위에서 바꾼 문자열을 기준으로 split 해준다.
        String str[] = s.split("-");        
        // 5. 나눠진 문자열 배열을 길이에 따라 다시 정렬한다.
        Arrays.sort(str,new Comparator<String>(){
            public int compare(String o1, String o2){
                
                return Integer.compare(o1.length(), o2.length());
            }
        });
        
        // 6. 각 문자열을 탐색한다.
        for(String x : str){
            // 7. 한 문자열마다 ,를 기준으로 split하여 새로운 문자열 배열을 만든다.
            String[] temp = x.split(",");
            // 8. 새로만든 문자열 배열에는 정수값만 존재하며 이를 탐색한다.
            for(int i = 0 ; i < temp.length;i++){
                // 9. 각 문자열 값을 정수로 바꾼다.
                int n = Integer.parseInt(temp[i]);
                // 10. 튜플에 들어있는 값이 아니라면 추가해준다.
                if(!answer.contains(n))
                    answer.add(n);
            }
        }
        
        return answer;
    }
}

 

 

반응형