1. 문제 설명
셀 수 있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플 (tuple)이라고 한다. n개의 요소를 가진 튜플을 n-tuple이라고 한다.
튜플은 다음과 같은 성질을 가지고 있다.
- 중복된 원소가 있을 수 있다. (예. (2, 3, 1, 2))
- 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플이다. (예. (1, 2, 3) ≠ (1, 3, 2))
- 튜플의 원소 개수는 유한하다.
(a1, a2, a3, ..., 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, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
- {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}
이렇게 다양하게 표현이 가능하다.
특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 반환하도록 하라.
2. 제한 사항
- s의 길이는 5 이상 1,000,000 이하이다.
- s는 숫자와 '{', '}', ','로만 이루어져 있다.
- 숫자가 0으로 시작하는 경우는 없다.
3. 코드
def solution(s):
s1 = s.lstrip('}').rstrip('{').split('},{')
s2 = []
# 각 원소로 이루어진 배열을 삽입
for i in s1:
if '{{' in i:
i = i.lstrip('{{')
if '}}' in i:
i = i.rstrip('}}')
s2.append(i.split(','))
# 원소의 길이를 기준으로 배열 정렬
s3 = []
for tuple in sorted(s2, key=len):
for t in tuple:
# 배열에 존재하지 않는 경우 순서대로 추가
if t not in s3:
s3.append(t)
return list(map(int, s3))
4. 해설
집합 형태의 s가 문자열로 들어왔고, 이를 원소 하나하나씩 떼어주는 작업이 필요하다.
- 문자열 맨 앞의 { 와 맨 뒤의 }를 제거해준다.
(예시 결과 : {2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4})
- '},{'를 기준으로 split 해준다.
(예시 결과 : ['{{2', '2, 1', '2, 1, 3', '2, 1, 3, 4}}'])
떼어낸 문자열을 원소 하나씩으로 분리해준다.
- 원소에 {{ 가 있거나 }} 가 있는 경우, 제거해준다.
(예시 결과 : ['2', '2, 1', '2, 1, 3', '2, 1, 3, 4']
- ','를 기준으로 split 해준다.
(예시 결과 : [['2'], ['2', '1'], ['2', '1', '3'], ['2', '1', '3', '4']]
각 배열 요소들을 짧은 길이 순서대로 sorting 해주고, 정답 배열에 존재하지 않는 경우에 원소를 추가한다.
- sorted(s2, key=len) : key에 정렬 기준 함수를 적어주면 되는데, python 내장 함수인 len을 적어주었다.
'Algorithm' 카테고리의 다른 글
프로그래머스 > 뉴스 클러스터링 (Python 3) | Counter, 다중 집합 (0) | 2024.07.08 |
---|---|
프로그래머스 > 피로도 (Python3) (0) | 2024.07.07 |
프로그래머스 > [1차] 캐시 (Python3) (0) | 2024.07.04 |
프로그래머스 > 의상 (Python3) (0) | 2024.07.03 |
프로그래머스 > 행렬의 곱셈 (Python3) (1) | 2024.07.03 |