코딩 테스트/leetCode

[leetCode] 2418. Sort the People (Python)

우주바다 2022. 10. 21. 21:32
728x90

▼ 문제 바로가기 (링크)  

https://leetcode.com/problems/sort-the-people/

 

Sort the People - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


길이가 같은 두 리스트 names, heights가 주어진다.

names[i] 의 키는 heights[i] 다.

키가 큰 순서대로 정렬해서 이름만 리스트로 반환하는 문제.

class Solution:
    def sortPeople(self, names: List[str], heights: List[int]) -> List[str]:       
        user = dict(zip(heights, names))  # 두 리스트를 딕셔너리로 저장
        tallest = sorted(user.keys(), reverse = True)     
        answer = list(tallest.values())
                 
        return answer
# 실행 결과 (오류)
AttributeError: 'list' object has no attribute 'values'
    answer = list(tallest.values())

우선 두 리스트를 key:value 형태로 묶었다.

키를 기준으로 정렬해야하므로 키,이름순서로 작성.

 zip()은 iterable(반복가능한) 객체를 인자로 받고 두 요소를 순서대로 엮어준다.

 

이름을 리스트로 반환하는 부분에서 오류.

리스트 객체에는 values 속성이 없다고.. 음..

class Solution:
    def sortPeople(self, names: List[str], heights: List[int]) -> List[str]:       
        user = dict(zip(names, heights))  # 두 리스트를 딕셔너리로 저장
        
        # 람다식을 통해 정렬 기준을 설정. 키-값에서의 키와는 다름. 
        # 키와 값 두 개 중 뒤에있는 값을 기준으로 정렬하므로 1을 입력
        
        user = sorted(user.items(), key=lambda x: x[1], reverse=True)   
        # print(user)   [('Mary', 180), ('Emma', 170), ('John', 165)]
        
        answer = []  

        for i in user:
            answer.append(i[0])
        
        return answer

딕셔너리 출력과 람다 표현식 검색해서 해결! (인 줄 알았으나..)

class Solution:
    def sortPeople(self, names: List[str], heights: List[int]) -> List[str]: 
        
        user = dict(zip(names, heights))              
        user = sorted(user.items(), key=lambda x: x[1], reverse=True)   
               
        answer = []  
        for i in user:
            answer.append(i[0])
        
        return answer

이 상태로 제출했더니  아래처럼 오류가.


Wrong Answer
 
Input
["Alice","Bob","Bob"]
[155,185,150]

Output
["Alice","Bob"]

Expected
["Bob","Alice","Bob"]

zip으로 합칠 때 가운데 Bob이 185와 함께 증발하는 문제가..

왜 그러지.. 곰곰히 생각해보니

key 값은 유일해야하는데 같은 이름이 있으니 뒤의 key로 덮어씌워져서..!

 

그럼 이제 어떻게 예외처리 해야 하나 검색해봤는데.. 잘 안 나온다 ..

https://kangprog.tistory.com/27 이건 딕셔너리의 키 값 중복을 클래스로

객체화 시켜서 해결한 경우. 음..!

 

이거 말고 좀 다른 방식으로 해결할 수는 없나.. 

게더 스터디에서 엉엉 울고 있었더니 코창님이 도와주셨다 ㅋㅋㅋㅋ

class Solution:
    def sortPeople(self, names: List[str], heights: List[int]) -> List[str]: 
        
        user = zip(heights, names)
        user = sorted(user, reverse=True)

        answer = []
        
        for i in range(len(names)):
            answer.append(user[i][1])
            
        return answer

도와주신 코드 ㅎㅎ.... zip을 단독으로 쓸 수 있는 줄 몰랐다!!!

뭔가 두 값이 연결된 상태로 정렬하고 출력해야하니까

무조건 딕셔너리 활용해서 해결해야 하는 줄 .. 뭔가 좀 허무하지만 후련하다.

마이크 켜고 해설까지 해 주셔서 감사합니다.. 하하하.. 

728x90
반응형