문제
내 풀이
1️⃣첫 시도
def solution1(s):
striped_s = s.strip("{""}") #2},{2,1},{2,1,3},{2,1,3,4
s_list = striped_s.split("},{") #['2', '2,1', '2,1,3', '2,1,3,4']
long_s = max( s_list, key=lambda x:len(x)) #2,1,3,4
answer = [ int(i) for i in long_s if i != ","] #['2', '1', '3', '4']
return answer
👉🏻결과로 나오는 [2, 1, 3, 4]와 [3, 2, 4, 1] 이 두 리스트가 같다고 착각을 했다. 즉 리스트의 원소만 같으면 같은 튜플에서 나온 결과값이라고 착각을 했다. 때문에 아래와 같은 순서로 잘못풀었다.
- 양 끝의 '{'와 '}'를 삭제해 striped_s에 할당하자!
- '},{'를 기준으로 나눠 리스트로 만들어 s_list에 할당하자!
- 길이가 가장 긴 집합(문자열)을 골라 long_s에 할당하자!
- long_s를 for문을 이용해 answer에 할당해 반환하자!
✍🏻strip() 괄호 속에 담긴 문자가 양 끝에 있으면 있는대로 삭제한다. 두 가지 문자를 넣고 싶으면 쉼표(,) 없이 두 가지 문자 넣어주면 된다.
✍🏻split() 괄호 속에 담긴 문자를 기준으로 나누어 리스트로 반환한다.
✍🏻각 집합 중 길이가 가장 긴 집합이 튜플의 원형이거나 순서가 바뀐 형태이므로 max()와 len()으로 길이를 판별해 가장 긴 집합을 추출한다.
✅lambda
📌람다는 필요할 때 즉시 사용하고 버리는 익명함수이다. 함수를 간편하게 작성할 수 있는 특성으로 다른 함수의 인수로 넣을 때 주로 사용한다. 아래 예시처럼 같은 기능을 가지고 같은 결과를 내더라도 일반함수보다 람다함수가 더 간결하다.
#매개 변수에 10을 더해 반환하는 함수를 만든다.
#이 함수들을 map을 활용해 리스트 [1, 2, 3]을 넣었을 때 [11, 12, 13]을 반환하도록 한다.
#일반 함수
def plus_ten(x):
return x + 10
list(map(pluse_ten, [1, 2, 3]))
#lambda 함수
list(map(lambda x : x + 10, [1, 2, 3]))
✍🏻max와 함께 사용하기
s_list = ['2', '2,1', '2,1,3', '2,1,3,4']
long_s = max( s_list, key = lambda x : len(x))
print(long_s) #2,1,3,4
👉🏻길이가 가장 긴 원소를 뽑기 위해 max 함수를 사용하고 key값으로 lambda 함수를 사용했다.
🐰이 때까지 틀린 점을 몰라서 맞을 줄 알고 오? 2단계 쉬운데? 얕봤다가 무참히 실패했다ㅎㅎ 정답률 0%기록.. 그래서 다시 문제 정독...
2️⃣두 번째 시도
from collections import Counter
def solution2(s):
striped_s = s.strip("{""}")
s_list = [ list.split(',') for list in striped_s.split("},{")] #[['1', '2', '3'], ['2', '1'], ['1', '2', '4', '3'], ['2']]
s_dic = {}
for element in s_list:
for num in element:
if num not in s_dic.keys():
s_dic[num] = 1
else:
s_dic[num] += 1
answer = Counter(s_dic).most_common()
return [ int(i[0]) for i in answer]
👉🏻문제를 세번째 읽으면서 집합 내의 원소들이 변하여도 모두 같은 튜플을 가리킨다는 것을 소홀히 읽고 지나갔음을 깨달았다. 그러면 순서가 뒤죽박죽인 집합에서 어떻게 하나의 튜플을 확정지을 수 있을지 고민해보았다. 튜플 (2, 1, 3, 4)는 {{2}, {2, 1}, {2, 1, ,3}, {2, 1, 3, 4}}로 나타낼 수 있다는 것을 보며 튜플의 첫 번째 원소에서 마지막 원소로 갈수록 집합에서 표현되는 수가 적다는 것을 깨달았다! 튜플의 첫 원소인 2는 집합에서 4번 나오고 마지막 원소인 4는 집합에서 1번만 나온다. 그래서 아래와 같은 순서로 풀었다.
- 양 끝의 '{'와 '}'를 삭제해 striped_s에 할당하자!
- '},{'를 기준으로 나눠 리스트로 만들고 for문을 돌려 s_list에 할당하자!
- s_list를 이중 for문에 돌리면서 원소가 s_dic이라는 딕셔너리 key에 없으면 1을 할당, 있다면 1을 더해주자! 이 과정을 통해 각 숫자들이 몇 번 나왔는지 알 수 있다!
- Counter를 사용해 value가 가장 큰 순서대로 순서가 정렬된 딕셔너리를 answer에 할당하자!
- answer를 for문에 돌리면서 key 값만 리스트에 담아 반환하자!
✅Counter
📌collections 모듈의 클래스 중 하나이다. 데이터의 개수를 셀 때 유용하다.
✍🏻most_common() 데이터 개수가 많은 순으로 정렬된 배열을 리턴하는 메서드로 Counter에 포함되어 있다.
🐰첫 프로그래머스 2단계 잘 마무리!
'그 땐 Algorithm했지 > 그 땐 Programmers했지' 카테고리의 다른 글
[self-study/level 1] SQL | 모든 레코드 조회하기 | SELECT (0) | 2022.02.26 |
---|---|
[self-study/level 1] 체육복 | 탐욕법(Greedy) - 도전편 (1) | 2022.02.25 |
[TAVE/level 1] 나머지가 1이 되는 수 찾기 (0) | 2021.12.22 |
[TAVE/level 1] 문자열 다루기 기본 (0) | 2021.12.20 |
[TAVE/level 1] 시저 암호 (0) | 2021.12.18 |