본문 바로가기

Algorithm

[프로그래머스] 코딩테스트 연습 - 튜플

코딩 테스트 연습 - 튜플 [2019 카카오 개발자 겨울 인턴십]

문제 설명

제한사항

입출력 예

 

풀이

문제 목표는 입력으로 주어지는 하나의 문자열 s를 문자열이 아닌 집합 표현으로 보고 해당 집합이 나올 수 있도록 튜플을 생성하는 것입니다.

튜플을 통해서 생성되는 문자열 s는 튜플의 처음부터 원소를 하나씩 포함하여 생성된 것을 문자열로 표현한 것으로 문자열 s를 문자열이 아닌 set 또는 list의 형식으로 바꿀 수 있으면 문제는 쉬워집니다.

나머지는 원소의 개수에 맞춰 튜플을 만들어주기만 하면 되니까요?ㅎㅎ

 

Code

def solution(s):
    answer, mydict = [], []
    temp = s[2:-2].split('},{')
    if len(temp) == 1: return [int(temp[0])]
    for i in temp:
        mydict.append(set(i.split(',')))
    mydict = sorted(mydict, key=lambda k : len(k))
    for idx in range(len(mydict)-1, 0, -1):
        ele = mydict[idx] - mydict[idx-1]
        answer.insert(0, int(ele.pop()))
    answer.insert(0, int(mydict[0].pop()))
    return answer

 

1. s [2:-2]를 '}, {'로 split 합니다. (s [2:-2]는 시작'{{'와 끝'}}'가 없는 문자열이니까요)

2. [첫 번째 for문] split 된 temp 리스트의 원소를 보며 다시 ','로 split 하고 set으로 변환하여 mydict에 추가합니다.

3. [두 번째 for문] mydict의 원소는 set의 형태니 집합 연산이 가능하고 마지막 원소부터 바로 앞의 원소를 빼주면 차집합의 원소가 튜플의 원소가 됩니다. 이걸 순서대로 answer의 0번째에 insert 하면 원본 Tuple이 됩니다. 

 

문제를 통과하고 나서 Counter를 이용하신 다른 분들의 풀이를 보니 아차 싶더라고요. 그래서 코드를 수정해보았습니다.

from collections import Counter
def solution(s):
    answer, mydict = [], []
    temp = s[2:-2].split('},{')
    for i in temp:
        mydict += i.split(',')
    count = Counter(mydict)
    return [int(k) for k, v in count.most_common()]

첫 번째 풀이의 2번까지 동일합니다. 다만 mydict 리스트에 append하지 않고 += 연산을 통해 list의 원소들을 이어 붙이죠.

그리고 나면 Counter를 사용해서 most_common의 key값을 사용하여 리스트를 만들어 반환해주면 끝입니다.

 

부족한 점이 많은 글이지만 봐주셔서 감사합니다 :)

잘못된 점이 있다면 댓글 남겨주시면 감사하겠습니다 :)