[PRG] 튜플

써니·2023년 7월 11일
1

Algorithm

목록 보기
5/17
post-thumbnail

1. 문제

  • tuple : 셀 수 있는 수량의 순서있는 열거 / 순서를 따르는 요소들의 모음
    • n-tuple : n개의 요소를 가진 tuple

    • 중복 원소 가능

    • 순서 있음

    • 원소 개수 유한

      ⇒ 특정 튜플을 표현하는 문자열 s가 표현하는 튜플을 배열에 담아 반환

    • 제한 사항

      • s의 길이는 5 이상 1,000,000 이하입니다.
      • s는 숫자와 '{', '}', ',' 로만 이루어져 있습니다.
      • 숫자가 0으로 시작하는 경우는 없습니다.
      • s는 항상 중복되는 원소가 없는 튜플을 올바르게 표현하고 있습니다.
      • s가 표현하는 튜플의 원소는 1 이상 100,000 이하인 자연수입니다.
      • return 하는 배열의 길이가 1 이상 500 이하인 경우만 입력으로 주어집니다.
    • 예제 입력

      sresult
      "{{2},{2,1},{2,1,3},{2,1,3,4}}"[2, 1, 3, 4]
      "{{1,2,3},{2,1},{1,2,4,3},{2}}"[2, 1, 3, 4]
      "{{20,111},{111}}"[111, 20]
      "{{123}}"[123]
      "{{4,2,3},{3},{2,3,4,1},{2,3}}"[3, 2, 4, 1]



2. 풀이

  • 파싱 이용하기
    • 주어진 문자열 s에서 숫자로 이루어진 부분 집합들을 뽑아낸 후,
    • 길이가 1인 것부터 (== 튜플의 가장 첫번째 원소) 부분집합의 길이를 기준으로 튜플의 다음 원소들을 추가


3. 코드

def solution(s):
    s = s[2:-2]
    ls = [ list(map(int,x.split(','))) for x in s.split('},{') ]
    ls = sorted(ls, key = lambda x: len(x))
    
    answer = []
    
    for e in ls:
        for num in e:
            if num not in answer:
                answer.append(num)
    
    return answer

  • 파싱 외에 정규표현식을 사용해보자
    ⇒ 역시… 찾는 origin이 길어지면 드라마틱하게 시간을 줄일 수 있다..!
    import re
    from collections import Counter
    def solution(s):    
        answer = []
        
        nums = dict(Counter(re.findall('\d+', s)))
        
        answer = list(map(int, sorted(nums.keys(), key= lambda x : nums[x], reverse=True)))
        
        return answer

0개의 댓글