본문 바로가기
알고리즘

[프로그래머스 - 실패율][파이썬]-4일차

by Jyujae 2022. 5. 29.

https://programmers.co.kr/learn/challenges

처참히 실패한 코드...

너무 과도한 for문과 보이는대로 하나하나 코딩한 느낌이 너무 난다.....

--정답 코드(구글링)

다른 분들은 어떻게 코드를 풀어가나 구글링 해보았다.

dictionary 자료 구조, lambda, 하나의 for문으로 유저수를 count 하고 실패율 계산


1. dictionray 자료 구조

 

나는 리스트 형태로 풀어야 했기 때문에, count리스트도 만들고, 사람수 리스트도 만들어서 나누어줘야 했다

dict형태로 풀면, key 값에 단계, value에 실패율을 매칭해서 더 간결하게 풀 수 있었다.

리스트로 했다면 런타임 오류가 분명히 났을 것.

-> 각각의 값과 인덱스가 매칭되어야 할 때 dict 구조를 떠올려 보자!

 

2. 하나의 for문으로 유저수를 count, 실패율을 계산

 

2단계면 1단계를 통과했을 것이니, 2단계 통과자들을 1단계 시도자에 포함시켜야하고.. 부터 생각이 꼬였다

단순하게 stages의 len, 즉 시도한 사람만큼(people)을 두고,

for문을 1부터 돌리면서, 1을 count하고 people로 나눠준다

그럼 전체 사람을 기준으로 가장 시작인 1부터 카운팅을 해주면, 모두가 1단계를 거쳤기 때문에, count에 포함이 된다.

이후에 count를 해주었던 i, 즉 for문에서 i 보다 작은 수들을 people에서 제거해 줌

(1단계에서 멈춘 사람들은 2단계를 try 못하기 때문에)

 

3. lambda

 

lambda 함수의 정의

def 이름(변수):

    return 결과

>>>>>>>

lambda 변수: 결과

 

ex)

def add(x):

    return x+20

 

lambda x:x+20

lambda의 sorted 응용

 

- sorted(대상, key= lambda x: 기준)

우리는 저 기준으로 통해 오름 내림 차순은 기본이며, 리스트 안에 ()가 있는 2차원 데이터도 (안의 몇번째 인자를 가지고 정렬 할 것인지도 결정이 가능하다)

ex)

sorted(dic, key=lambda x:x[1])

dic=[(1,2),(6,9)~~~] 이런식일때 2, 9 을 비교하면서 정렬을 시작한다

dic의 인덱스 기준으로 리스트를 정렬할 것이기 때문에 i: dic[i]로 작성하고, 역순으로 정렬해준다!