본문 바로가기

백준 문제풀이

[파이썬] 카카오 프로그래머스 문제 풀이

728x90

아래 링크를 통해 카카오 프로그래머스 문제 페이지로 이동합니다.

 

https://school.programmers.co.kr/learn/challenges?order=acceptance_asc&levels=1&languages=python3&partIds=37527%2C31236%2C25448%2C20069%2C17214%2C12286%2C9317%2C22586%2C18498%2C17931%2C300%2C301&page=1

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

위 문제에서 신고 결과 받기 문제와 실패율의 문제 풀이를 알아보겠습니다.

 

1. 신고 결과 받기

 

 

문제입니다.

유저 아이디와 신고당한 아이디를 통해

k번 이상 신고된 유저가 정지당하고 신고한 유저에게 메일이 가게 됩니다.

이 메일이 간 횟수를 구하는 문제입니다.

 

 

입출력 예시입니다.

frodo와 neo가 각 2번씩 신고 받았고 k는 2이므로 두 아이디가 정지당하고

frodo와 neo를 신고한 muzi, frodo, apeach에게 메일이 가게 됩니다.

 

이 문제는 파이썬의 딕셔너리를 활용하면 쉽게 풀 수 있습니다.

 

def solution(id_list, report, k):
    answer = []
    
    rep = set(report)
    mail_id= {m:0 for m in id_list}
    repo_id = {r:0 for r in id_list}
    
        
    for i in rep:
        sp_id = i.split(' ')
        repo_id[sp_id[1]]+=1
    
    for i in rep:
        sp_id = i.split(' ')
        if repo_id[sp_id[1]]>=k:
            mail_id[sp_id[0]]+=1
    answer = list(mail_id.values())
    return answer

먼저 report를 중복 제거 해줍니다.

다음 mail_id와 repo_id를 딕셔너리로 선언합니다.

key는 각 id_list의 값이 들어가고 value는 0이 들어갑니다.

 

반복문을 돌려주고

중복 제거해 신고당한 유저의 아이디를 

key값에 넣어 해당 key의 value에 1을 더해줍니다.

 

아래 반복문은 만약 신고당한 아이디가 k를 넘긴다면

mail_id에 key의 value를 1 더해줍니다.

 

다음 mail_id의 value값을 리스트로 변경해 answer에 저장합니다.

 

728x90

 

2. 실패율

 

 

문제입니다.

각 스테이지의 실패한 사람을 토대로 스테이지 별 실패율을 구하고

정렬하는 문제입니다.

 

 

입출력 예입니다.

스테이지 개수는 N+1입니다.

result는 실패율을 정렬해 스테이지로 표현합니다.

단, 실패율이 같을 시 낮은 스테이지 순으로 정렬합니다.

 

def solution(N, stages):
    answer = []
    ct = []
    u = len(stages)
    for i in range(1,N+1):
        sum = stages.count(i)
        if sum == 0:
            ct.append(0)
        else:
            ct.append(sum / u)
            u -= stages.count(i)      
    answer = sorted(range(len(ct)),key = lambda x : ct[x],reverse = True)
    for i in range(len(answer)):
        answer[i]+=1
    return answer

 

먼저 빈 리스트 ct를 선언하고 stages의 길이를 u 변수에 저장합니다.

 

1부터 N+1만큼 반복문을 돌립니다.

sum에 stages안에 i번째 스테이지가 몇번 들어있는지 수를 세어줍니다.

 

만약 sum이 0이면 ct에 0을 append하고

아니라면 ct에 실패율을 저장합니다.

 

그 후 다음 실패율을 구하기 위해 u에 스테이지 개수를 빼줍니다.

다음 answer에 실패율을 정렬합니다.

 

range(len(ct))에는 ct의 길이만큼 들어갑니다.

lambda에는 ct의 실패율이 들어갑니다.

따라서 range(len(ct))를 ct의 실패율을 기준으로 정렬한다고 생각하시면 됩니다.

 

다음 answer에 0부터 들어갔으므로 각 값에 1을 더해줍니다.

728x90
반응형