본문 바로가기

PS

[programmers] 튜플 문제 - Python

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2019 카카오 개발자 겨울 인터십 기출문제라고 한다.

풀기는 풀었는데 되게 불편하게 풀었다. 풀고도 이렇게 푸는게 맞나 싶게 풀었다.

하필 입력의 형태가 문자열이라서 좀 헤맸다.


문자열 s 에서 일단 각각의 원소들을 따로 빼내야 답을 찾을 수 있을 것 같다.

s = "".join(list(s)[1:-1]).split('},{')

예를 들어서 "{{4,2,3},{3},{2,3,4,1},{2,3}}"list 로 변환하면 각각의 문자가 원소인 리스트가 된다.

첫번째 원소와 마지막 원소를 제외하고 인덱싱을 하면 가장 바깥을 둘러싸고 있는 중괄호를 지워준다.

이제 다시 join 을 통해서 하나의 문자열로 만들어 준다. "{4,2,3},{3},{2,3,4,1},{2,3}" 의 상태가 되었다.

이를 },{split 해서 각각의 원소로 쪼개준다. 즉 ["{4,2,3", "3", "2,3,4,1", "2,3}"] 의 상태가 된다.

 

s[0] = s[0][1:]
s[-1] = s[-1][:-1]

아직 남은 첫번째와 마지막 원소의 중괄호를 제거해준다. s["4,2,3", "3", "2,3,4,1", "2,3"] 의 상태가 된다.

 

to_list = []
for l in s:
    to_list.append(set(map(int, l.split(','))))

리스트 안의 각각의 원소들을 , 를 기준으로 다시 스플릿해서 int 로 변환해 set 에 담는다.

그리고 각각의 set 을 다시 리스트에 담아주자.

 

to_list.sort(key=lambda x:len(x))

이제 각각의 원소 개수를 기준으로 정렬을 하자. 순서를 파악하기 위함이다.

 

answer.append(list(to_list[0]).pop())
for i in range(len(to_list)-1):
    target = list(to_list[i+1].difference(to_list[i]))[0]
    answer.append(target)

굳이 set 으로 넣은 이유는 차집합을 사용하기 위해서이다.

첫번째는 비교할 필요가 없으니 바로 정수를 뽑아 answer 에 넣고 두번째부터 다음과 차집합으로 추가된 원소를 찾아 answer 에 넣는다.

 

 

 

전체 코드

# 프로그래머스 64065번 튜플 문제

def solution(s):
    answer = []

    # 제일 앞,뒤 중괄호 제거, 각 튜플 간 },{ 제거
    s = "".join(list(s)[1:-1]).split('},{')

    # 첫번째 원소와 마지막 원소는 각각 {, }가 아직 붙어 있다. 제거하자.
    s[0] = s[0][1:]
    s[-1] = s[-1][:-1]

    to_list = []
    for l in s:
        # 각 l들은 1,2,3 형태의 문자열이므로 split해서 set형태로 넣어준다
        to_list.append(set(map(int, l.split(','))))

    # 순서대로 뭐가 추가 되었는지 확인하기 위해서 원소 개수 기준으로 정렬
    to_list.sort(key=lambda x:len(x))

    # 첫번째꺼는 차집합 할 대상이 없으므로 미리 넣어두고
    answer.append(list(to_list[0]).pop())
    for i in range(len(to_list)-1):
        # 두번째꺼 부터는 차집합해서 뭐가 추가되었는지 표기
        target = list(to_list[i+1].difference(to_list[i]))[0]
        answer.append(target)
    return answer