https://school.programmers.co.kr/learn/courses/30/lessons/64065
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
'PS' 카테고리의 다른 글
[programmers] 야근 지수 문제 - Python (1) | 2023.01.14 |
---|---|
[programmers] 최댓값과 최솟값 문제 - Python (0) | 2022.12.23 |
[BOJ] 1323번 숫자 연결하기 문제 - Python (0) | 2021.04.06 |
[BOJ] 18870번 좌표 압축 문제 - Python (0) | 2021.04.05 |
[BOJ] 1931번 회의실 배정 문제 - Python (0) | 2021.03.25 |