문제설명 (링크 참조)
입력받은 문자열을 확인하여 제대로 된 순서의 리스트로 변환 후 리턴
풀이
문제에서 입력받은 문자열 s에서 값들을 추출하는게 관건이었던 문제.
처음에는 리스트 형식으로 요소를 주는 줄 알았지만 하다보니 문자열로 준다는 것을 깨닫고 어떻게 문자열에서 각 요소들을 정리해서 추출할 수 있을까 고민을 많이 함.
- 우선 입력받은 s의 튜플 하나하나를 리스트로 바꿔준다.
- 리스트의 요소들을 str에서 int로 바꿔준다.
- s[2:-2:].split('},{')를 해주면 { }전부 제외하고 각 튜플을 하나의 요소로 만들어 줄 수있다.
- 그리고 for문을 돌며 각 요소를 다시 split(',')해주고 값들을 str에서 int로 바꿔주면 각각의 요소들을 얻을 수 있다.
- res 딕셔너리에 길이를 key로 저장해준다.
{{2},{2,1},{2,1,3},{2,1,3,4}} 이 문자열을
{1: [2], 2: [2, 1], 3: [2, 1, 3], 4: [2, 1, 3, 4]} 이런식으로 길이를 key값으로 얻을 수 있음.
- res를 반복문으로 돌면서 모든 배열의 요소를 확인하며 answer에 값을 넣어준다.
{{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}} 의 형식이므로
res에서 길이가 1인(key값이 1인) value 부터 확인하면서 answer에 없을경우 요소 추가.
코드
def solution(s):
res={}
answer = []
#입력받은 문자열은 인덱싱해서 리스트로 만들어줌
arr=s[2:-2:].split('},{')
for i in arr:
a=i.split(',')
#str을 int로 바꿔줌
for j in range(len(a)):
a[j]=int(a[j])
res[len(a)]=a
#크기가 1인 것 부터 확인하면서 answer배열에 안들어가 있으면 넣고 다음으로 넘어감.
for i in range(1,len(res)+1):
for j in range(len(res[i])):
if(res[i][j] not in answer):
answer.append(res[i][j])
break
return answer
특이사항
- 다른사람풀이 보니까 여러 방법이 있는 것 같다. 정규표현식으로 한줄로 푼 괴수분을 보았다...
- 또 정규표현식이 아니더라도 나처럼 굳이 딕셔너리를 쓰지않고 리스트를 sort해서 작성하신 분들도 보았다.
'알고리즘' 카테고리의 다른 글
[백준] 20006 랭킬전 대기열 python (0) | 2024.01.19 |
---|---|
[프로그래머스] 방문 길이 python (0) | 2024.01.18 |
[프로그래머스] 호텔 대실 python (0) | 2024.01.17 |
[프로그래머스] 문자열 압축 python (1) | 2023.10.02 |
[프로그래머스] 양궁 대회 Python (0) | 2023.10.02 |