0130 TIL

looggi·2023년 1월 30일
1

스파르타 내배캠 AI-3

목록 보기
129/130
post-thumbnail

프로그래머스 문제풀기

➡️ 실패율

def solution(N, stages):
	# 스테이지 당 플레이어의 수
    no_of_player_on_stage=[]
    for i in range(N):
        if i+1 in stages:
            stage_player=stages.count(i+1)
        else:
            stage_player=0
        no_of_player_on_stage.append(stage_player)
    # 실패율
    failure=[]
    for no,no_of_player in enumerate(no_of_player_on_stage):
        if sum(no_of_player_on_stage[no:]) !=0: # 분모가 0일 경우
            if N+1 in stages:
                fin_players=stages.count(N+1) # 게임을 클리어한 플레이어의 수
                failure.append(no_of_player/(sum(no_of_player_on_stage[no:])+fin_players))
            else:
                failure.append(no_of_player/sum(no_of_player_on_stage[no:]))
        else:
            failure.append(0)
    stage_no = [x+1 for x in range(N)]
    failure_dict=dict(zip(stage_no,failure))
    failure_sorted=sorted(failure_dict, key=lambda x: failure_dict[x], reverse=True)
    return failure_sorted

많이 기넹..ㅋㅅㅋ
테스트 22 〉 통과 (2542.59ms, 18MB)

  • 실패율을 구할 때 분모를 전체 플레이어의 수-스테이지 번호보다 작은 플레이어의 수의 합 으로 할까 스테이지 번호보다 큰 플레이어 수의 합으로 할까 하다가 후자가 더 간단할 것 같았는데 결국 클리어한 사용자를 생각을 못해서 첨에 통과를 못했다. 클리어한 사용자가 몇명인지도 모르는데 왜 첨에 1을 더했는지ㅎㅅㅎ
    무튼 만약 전자를 택했으면 전체 합에서 빼니까 굳이 fin_player을 안구하고 안더해도 되니까 더 간단할 것 같다 → 와 근데 첫번째 스테이지당 플레이어의 수 구할 때 클리어한 플레이어의 수를 아예 계산을 안해서 이러나 저러나 fin_player를 구해서 더해줘야함 ㅋㅋㅋ
  • 그리고 중간에 N+1(클리어한 사용자)값이 스테이지에 있든 없든 어차피 fin_player을 count해서 더해주니까 저렇게 if-else를 나눌 필요가 없당 첨엔 무조건 1명이라고(도대체 왜 그랬는지 진짜 모르겠다) 생각해서 나눴었는데 어찌됐든 없애버려야지
  • 와 근데 또 생각해보니까 그냥 애초에 o_of_player_on_stage를 제대로 구했으면 됐잖아??싶어서 보니까 맨 마지막에 한줄만 추가해주면 됐다.. ㄹ무튼 수정해봄
def solution(N, stages):
    # 스테이지당 플레이어의 수
    no_of_player_on_stage=[]
    for i in range(N):
        if i+1 in stages:
            stage_player=stages.count(i+1)
        elif i+1 not in stages:
            stage_player=0
        no_of_player_on_stage.append(stage_player)
    if N+1 in stages:
        no_of_player_on_stage.append(stages.count(N+1))
    
    # 실패율
    failure=[]
    for no,no_of_player in enumerate(no_of_player_on_stage):
        if sum(no_of_player_on_stage[no:]) !=0:
            failure.append(no_of_player/sum(no_of_player_on_stage[no:]))
        else:
            failure.append(0)
    
    # 실패율로 스테이지 넘버 정렬
    stage_no = [x+1 for x in range(N)]
    failure_dict=dict(zip(stage_no,failure))
    failure_sorted=sorted(failure_dict, key=lambda x: failure_dict[x], reverse=True)
    
    return failure_sorted

테스트 22 〉 통과 (1579.50ms, 18.1MB)
그래도 길지만 시간도 좀 덜 들고? 리팩토링으로는 만족 근데 웃긴 건 난 이게 젤 맘에 드는데 두번째로 고친 게 더 빠르다 뭐 진짜 얼마 차이 안나서 티도 안나긴 하지만? append보단 그냥 덧셈이 낫다 이건가 무튼 이제 다른 사람들이 얼마나 똑똑한지 구경하러 가야징..
그래도 이제 range(len()) 덜 써서 좀 직관적인 것 같다 퓨..

➡️ 하샤드 수

def solution(x):
    total=0
    y=x
    while y>10:
        total+=y%10
        y=y//10
    total+=y
    if x%total==0:
        return True
    else:
        return False

else는 없어도 된다
근데 사실 return x%total==0 이렇게 쓰면 된다.. 3줄이나 짧아짐ㅋㅋ

def solution(x):
    x=str(x)
    total=0
    for i in x:
        total+=int(i)
    return int(x)%total==0

→ 내가 스트링으로 풀었을 때 💥

def Harshad(n):
    return n % sum([int(c) for c in str(n)]) == 0

→ 남이 스트링으로 풀었을 때
ㅋㅋㅋㅋㅋㅋㅋㅋ

  • 아니 첨에 x를 str로 바꾼 값으로 넣어줄 게 아니라 그냥 str(x)로 쓰면 다시 바꿀 필요가 없음
  • ❓근데 for문에 있는 조건식도 계속해서 연산이 되나? str을? str이 i의 갯수만큼 반복되나? 그럼 아예 바꿨다가 다시 바꾸는 게 더 효율적인가??

리스트 축약식+내장함수 조합 나도 언젠간 이렇게 풀 수 있겠지???

profile
looooggi

0개의 댓글