[PROG] 64065 튜플.py

호호빵·2022년 10월 4일
0

Algorithm

목록 보기
30/46

문제

나의 풀이

  • 길이가 같은 튜플을 골라 answer에 없는 원소를 append 한 후 출력
def solution(s):
    answer = []
    n = len(s)

    for i in range(1, n+1):
        for k in s:
            if len(k) == i:    # 길이가 같은 튜플
                for j in k:	   # 그 튜플의 원소 중
                    if j not in answer:		# answer에 없으면 append
                        answer.append(j)
    return answer
    
    
답 "{{2},{2,1},{2,1,3},{2,1,3,4}}"	[2, 1, 3, 4]
   

# [{2},{2,1},{2,1,3},{2,1,3,4}] 로 처리하니까 정답 잘 나옴
[2, 1, 3, 4]
[2, 1, 3, 4]
[111, 20]
[123]
[3, 2, 4, 1]

프로그래머스 채점

  • 임의로 내가 리스트 형태로 입력하였을 때는 인식을 잘해서 답이 잘나옴
    (3중 for문이 보기 싫기는 하지만)
  • 하지만 programmers 에서는 정답x
  • {}형식으로 실행하면 TypeError: unhashable type: 'set' 에러 뜸
"타입에러: 해시할 수 없는 타입: set" 
set이나 딕셔너리의 키의 원소는 해시할 수 있는 "변형이 불가능한" (immutable) 값이어야 한다. 
리스트와 튜플의 차이는 리스트는 리스트에 원소를 더하거나 빼거나 할 수 있는 변형이 가능한 타입이다. 
튜플은, 반면, 한번 정의되면 변형이 불가능한 타입이다. 


해답 풀이

def solution(s):
    answer = []
    s = s[:-2].replace('{', '').replace(',', ' ').split('}')

    for i, v in enumerate(s):
        s[i] = v.split()
    n = len(s)

    for i in range(1, n+1):
        for k in s:
            if len(k) == i:
                for j in k:
                    if j not in answer:
                        answer.append(j)

    answer = [int(i) for i in answer]

    return answer
  • 프로그래머스에서 정답!
  • 리스트 형식이아닌 문자열로 들어온 값을 리스트로 바꾸는 작업 필요
  • for문을 줄일 필요가 있음

리팩토링 과정

def solution(s):
    answer = []
    s = s[:-2].replace('{', '').replace(',', ' ').split('}')
    		# {{2},{2,1},{2,1,3},{2,1,3,4}} -> 
            # 					{{2},{2,1},{2,1,3},{2,1,3,4
            # 					2} 2 1} 2 1 3} 2 1 3 4
            # 					['2', ' 2 1', ' 2 1 3', ' 2 1 3 4']

    for i, v in enumerate(s):
        s[i] = v.split()
 			# s = [i.split() for i in s] 한 줄로 치환 가능
    n = len(s)

    for i in range(1, n+1):
        for k in s:
            if len(k) == i:
                for j in k:
                    if j not in answer:
                        answer.append(j)

    answer = [int(i) for i in answer]

    return answer
    
    
    
 i) n = len(s) 로 받아서 길이가 i와 같은 것에서 원소를 구하려고 했으나
 	길이 순으로 정렬 후 사용하면 중복 for문을 줄일 수 있음
    
    s.sort(key=len)     # s.sort(key=lambda x:len(x))  차이점 공부하기!
        
    for i in s:
        for j in i:
            if j not in answer:
                answer.append(j)
    

ii) 바로 int(j) 처리하기

최종 풀이

def solution(s):
    answer = []
    s = s[:-2].replace('{', '').replace(',', ' ').split('}')

    s = [i.split() for i in s]

    s.sort(key=len)

    for i in s:
        for j in i:
            if int(j) not in answer:
                answer.append(int(j))

    return answer

print(solution("{{2},{2,1},{2,1,3},{2,1,3,4}}"))



TypeError : unhashable type
튜플 문제풀이
TIL - 1004(enumerate())

profile
하루에 한 개념씩

0개의 댓글