본문 바로가기

그 땐 Algorithm했지/그 땐 Programmers했지

[TAVE/level 2] 튜플

728x90

문제

 

내 풀이

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] 이 두 리스트가 같다고 착각을 했다. 즉 리스트의 원소만 같으면 같은 튜플에서 나온 결과값이라고 착각을 했다. 때문에 아래와 같은 순서로 잘못풀었다.

  1. 양 끝의 '{'와 '}'를 삭제해 striped_s에 할당하자!
  2. '},{'를 기준으로 나눠 리스트로 만들어 s_list에 할당하자!
  3. 길이가 가장 긴 집합(문자열)을 골라 long_s에 할당하자!
  4. 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번만 나온다. 그래서 아래와 같은 순서로 풀었다.

  1. 양 끝의 '{'와 '}'를 삭제해 striped_s에 할당하자!
  2. '},{'를 기준으로 나눠 리스트로 만들고 for문을 돌려 s_list에 할당하자!
  3. s_list를 이중 for문에 돌리면서 원소가 s_dic이라는 딕셔너리 key에 없으면 1을 할당, 있다면 1을 더해주자! 이 과정을 통해 각 숫자들이 몇 번 나왔는지 알 수 있다!
  4. Counter를 사용해 value가 가장 큰 순서대로 순서가 정렬된 딕셔너리를 answer에 할당하자!
  5. answer를 for문에 돌리면서 key 값만 리스트에 담아 반환하자!

 

Counter

📌collections 모듈의 클래스 중 하나이다. 데이터의 개수를 셀 때 유용하다.

✍🏻most_common() 데이터 개수가 많은 순으로 정렬된 배열을 리턴하는 메서드로 Counter에 포함되어 있다.

 

🐰첫 프로그래머스 2단계 잘 마무리!

728x90