Data Analyst KIM

[프로그래머스Lv1] 신고 결과 받기(파이썬) 본문

데이터 분석/Coding Test

[프로그래머스Lv1] 신고 결과 받기(파이썬)

김두연 2023. 8. 17. 21:00
반응형
 

프로그래머스

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

programmers.co.kr

[프로그래머스Lv1] 신고 결과 받기(파이썬)
[프로그래머스Lv1] 신고 결과 받기(파이썬)
[프로그래머스Lv1] 신고 결과 받기(파이썬)

 

<문제 풀이>

 

1. id_list에게 메일을 보내는 횟수를 나타낼 리스트를 만들자 => answer
2. 신고 횟수를 누적하는 방을 딕셔너리를 만들자 => report_all
3. report에 중복되는 값을 제거하자 => set(report)
4. 중복되지 않는 report를 split하고 1번 인데스의 값을 신고 횟수 누적하는 딕셔너리에 누적하자.
5. 딕셔너리에 누적된 값이 k보다 크거나 같으면 
6. report를 split한 0번째 인덱스의 값이 id_list에 해당하는 리스트의 인덱스에 메일을 보내는 횟수의 리스트(answer)에 1을 더해라

 

def solution(id_list, report, k):
    answer = [0] * len(id_list)
    report_all = {i : 0 for i in id_list}
    
    for i in set(report):
        report_all[i.split(' ')[1]] += 1
        
    for i in set(report):
        if report_all[i.split(' ')[1]] >= k :
            answer[id_list.index(i.split(' ')[0])] += 1
    
    return answer

 

 

코드를 활용해서 최대한 줄일 수 있는 방향으로 생각하면서 위에 코드를 만들었다.

처음에는 문제에서의 흐름만 따라가면서 코드를 작성해봤는데 예시 문제 2개는 통과를 했지만 

제출을 하면 틀리거나 시간초과가 대부분이였다.

그래서 최대한 줄이는 방향으로 생각을 했고 과정의 코드는 생략했지만 최종적으로 위와 같이 코드를 작성할 수 있었다.

처음에는 이중 for문과 여러개의 list를 활용해서 사용해서 그런지 매우 비효율적이였다.

그래서 가장 효율적인 방법을 생각해내다가 딕셔너리와 set함수를 활용했다.

 

<처음 시도한 코드>

def solution(id_list, report, k):
    answer = [0]*len(id_list)
    count= [0]*len(id_list)
    lst = [] 
    kkk = []
    for i in range(len(report)) :
        a = report[i].split(' ')
        if a not in lst :   # 동일한 유저ID와 유저가 신고한 ID가 동일하면 삭제
            lst.append(a)
    
    for i in range(len(lst)):   # 신고당한 횟수를 계산
        for v in range(len(id_list)) :
            if lst[i][1] == id_list[v] :
                count[v] += 1
            else :
                pass
    
    for a,b in zip(count,id_list):
        if a >=2 :
            kkk.append(b)
    
    for i in range(len(lst)):
        if lst[i][1] in kkk :
            idx = id_list.index(lst[i][0])
            answer[idx] += 1
    return answer

 

반응형