[Programmers](python) 튜플 _ 2019 카카오 인턴십

berry ·2022년 7월 4일
0

Algorithm

목록 보기
75/77
post-thumbnail

🧩 문제


🧩 문제 해석

집합에서,

{{1,2,3},{2,1},{1,2,4,3},{2}}

원소 개수가 작은 집합의 원소부터, 원소들을 튜플에 차례대로 담아 return하는 것이다.

튜플은 다음과 같은 성질을 가지고 있습니다.

  • 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)
  • 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)
  • 튜플의 원소 개수는 유한합니다.

원소 개수가 작은 순서대로 집합들을 정렬한다면

{{2},{2,1},{1,2,3},{1,2,4,3}}

가 된다.
하지만 문제에서는 중복되지 않은 튜플을 제공하므로
이 집합으로 튜플을 만든다면

(2, 1, 3, 4)

가 된다. (차례로 더해진 원소 순서대로)


🏁 내 풀이

def solution(s):
    data = [[] for _ in range(len(s))] # 숫자를 넣을 리스트 초기화

    s = s[1:len(s)-1] # 어차피 집합의 모임이므로, 제일 바깥 괄호 제거
    num = '' # 임시 숫자를 담을 변수
    answer = [] # 정답을 담을 변수

    for i in range(len(s)):
        if s[i] == '{': # {이면 임시 숫자 시작
            now = i
            flag = True
        elif s[i].isdecimal(): # 숫자이면
            num += s[i] # 임시 숫자에 저장
        elif s[i] == ',': # ,가 나오면 같은 리스트 내 다른 숫자인지, 다른 집합인지 구별
            if flag == True: # 같은 리스트 내 다른 숫자이면
                data[now].append(num) # now와 같은 리스트에 더하기
                num = '' # 임시 숫자 초기화
        elif s[i] == '}': # 임시 숫자 입력 끝
            data[now].append(num)
            num = ''
            flag = False

    data.sort(key=len) # 원소 수대로 정렬

    for i in range(len(data)): # 빈 리스트 제거
        if len(data[i]) > 0:
            data = data[i:] # 빈 리스트들 삭제
            break

    for i in data:
        for num in i:
            if int(num) not in answer: # 원소 길이가 1인 리스트부터 하나씩 더해져가며 집합이 생기므로, 중복 제거하여 튜플 만들기
                answer.append(int(num))

    return answer

🧩 다른 풀이


def solution(s):

    s = Counter(re.findall('\d+', s)) 
    return list(map(int, [k for k, v in sorted(s.items(), key=lambda x: x[1], reverse=True)]))

import re
from collections import Counter

📌 import re

📌 from collections import Counter

  • Counter()
    문자열 내의 같은 문자의 개수를 세어 딕셔너리 형태로 제공하는 모듈

위 코드는 해당 숫자가 나온 회수를 많은 순서대로 정렬하여 리스트로 만들어 return 하였다.
멋찌다..


profile
Engineer

0개의 댓글