본문 바로가기
Algorithm

[Python] 프로그래머스 | [PCCE 기출문제] 10번 / 데이터 분석

by dokkisan 2024. 1. 2.

https://school.programmers.co.kr/learn/courses/30/lessons/250121

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이 문제를 풀면서 좀 더 파이썬스러운 코드는 무엇일지 고민해 볼 수 있었다.

이를 위해 인덱싱리스트 컴프리헨션에 좀 더 익숙해지는 게 필요하다고 느꼈다.


data를 파싱해 ext와 val_ext, sort_by와 비교해야하기 때문에 리스트로 인덱싱 하거나, 딕셔너리의 key로 접근해야 한다고 생각했다.

 

첫 코드는 언어만 파이썬일 뿐 자바 코드와 다를게 없었다.

게다가 index() 메서드를 생각하지 못해 딕셔너리를 사용했다.

딕셔너리의 key, index를 지정하는 부분도 중복되어 코드가 깔끔하지 않다.

def solution(data, ext, val_ext, sort_by):
    answer = list()

    data_dic = dict()

    for i in range(len(data)):
        data_dic['code'] = data[i][0]
        data_dic['date'] = data[i][1]
        data_dic['maximum'] = data[i][2]
        data_dic['remain'] = data[i][3]

        if data_dic[ext] < val_ext:
            answer.append(list(data_dic.values()))

    index_dic = {'code': 0, 'date': 1, 'maximum': 2, 'remain': 3}
    answer = sorted(answer, key=lambda answer: answer[index_dic[sort_by]])

    return answer

answer = [[]] 로 선언되어 있어 빈 배열을 어찌할지 몰라 answer = list()로 수정해버렸다.

(remove() 메서드를 사용하는 방법도 있다.)

 

파이썬스럽고 간결한 코드로 수정하기 위해 리스트 컴프리헨션을 이용했다.

리스트 컴프리헨션을 이용하면 answer의 빈 배열도 제거할 수 있고, 조건문도 같이 사용해 비교가 가능하다.

def solution(data, ext, val_ext, sort_by):
    answer =[[]]

    condition_lst = ['code', 'date', 'maximum', 'remain']
    answer = [item for item in data if item[condition_lst.index(ext)] < val_ext]
    answer = sorted(answer, key=lambda x: x[condition_lst.index(sort_by)])

    return answer