알고리즘

[프로그래머스] 튜플(카카오 인턴)

winwin-k9 2023. 8. 9. 22:12

문제

셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.

(a1, a2, a3, ..., an)
튜플은 다음과 같은 성질을 가지고 있습니다.

중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)
원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)
튜플의 원소 개수는 유한합니다.
원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다.

{{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}
예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는

{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
와 같이 표현할 수 있습니다. 이때, 집합은 원소의 순서가 바뀌어도 상관없으므로

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
  • {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
  • {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}
    는 모두 같은 튜플 (2, 1, 3, 4)를 나타냅니다.

특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요.

풀이

구현으로 풀이할 수 있었다.
주의할 점은 String 하나에 모든 문자가 들어있으므로 파싱할 때 주의해야 한다.
{과 }는 메타캐릭터이기 때문에 이스케이프 문자열을 이용해서 파싱해야 한다.

},{를 파싱하고, 맨앞의 {{와 맨뒤의 }}를 삭제하면 깔끔하게 숫자와 콤마만 남으므로 숫자 추출이 가능해진다.

먼저 배열을 길이순으로 정렬해주는 것이 중요하다.
주어진 숫자들을 보면 첫 숫자를 기준으로 어느정도 순서 있게 조합이 주어지므로 이를 이용하는 것이다.

길이가 1인 문자는 그 자체로 첫번째 숫자가 되므로 저장해준다.
그후, 그다음 길이가 긴 문자열에서 길이가 1인 문자를 빼주면 두번째 숫자가 된다.
이를 반복해서 구해줄 수 있다.

import java.util.*;
import java.lang.*;

class Solution {
    public int[] solution(String s) {
        String[] str = s.split("\\},\\{");
        str[0] = str[0].replaceFirst("\\{\\{", "");
        str[str.length - 1] = str[str.length - 1].replaceFirst("\\}\\}", "");
        List<String> list = new ArrayList<>();
        Arrays.sort(str, new Comparator<String>() {
            public int compare(String s1, String s2) {
                return s1.length() - s2.length();
            }
        });
        list.add(str[0]);

        for (int i = 1; i < str.length; i++) {
            String[] strArr = str[i].split(",");
            for (int k = 0; k < strArr.length; k++) {
                int index = list.indexOf(strArr[k]);
                if (index == -1) {
                    list.add(strArr[k]);
                }
            }

        }

        return list.stream().mapToInt(Integer::parseInt).toArray();

    }
}

https://github.com/Win-9/Algorism/tree/main/programers/%ED%8A%9C%ED%94%8C

728x90