본문 바로가기
🔅코딩테스트 공부🔅/❗프로그래머스(Lv.1)

[프로그래머스] Level1 신고 결과 받기(python)

by 윤무무 2023. 2. 11.

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

 

프로그래머스

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

programmers.co.kr

 

1. 내가 작성한 코드
def solution(id_list, report, k):
    
    fault = {} #신고를 당한 사람
    result = [] #신고한 사람 전체
    result1 = {} #메일 받을 횟수
     
    for i in id_list:
        fault[i] = []
        result1[i] = 0
        
    for i in set(report):
        a,b = i.split()
        fault[b].append(a)
        
    for i in id_list:
        if len(fault[i]) >=k:
            result.append(fault[i])
    
    for i in result:
        for j in i:
            result1[j] += 1
        
    answer = list(result1.values())

    return answer

 

50분이나 걸렸지만,, level1 이지만,, 카카오 문제 해결할 수 있다는 자신감을 좀 씩 얻고 있다,,

 

이 문제는 정확성 테스트로 제한시간이 10초가 있어서, 시간복잡도를 줄이는 것에 초점을 맞추고자 노력했다.

 

 

2. 알고리즘
def solution(id_list, report, k):
    
    fault = {} #신고를 당한 사람
    result = [] #신고한 사람의 전체
    result1 = {} #메일 받을 횟수
     
    for i in id_list:
        fault[i] = []
        result1[i] = 0

 

1. '신고를 당한 사람 : 신고를 한 사람'의 형식으로 딕셔너리를 만들어준다. #fault 

 

2. k번 이상으로 신고를 당한 사람을 신고했던 모든 사람의 이름을 넣기 위해 list를 만들어준다 #result

 

2. 메일을 받을 횟수를 카운팅 하기위해 '이름 : 0'으로 딕셔너리를 만들어준다 #result1

 

for i in set(report):
        a,b = i.split()
        fault[b].append(a)

 

3. 같은 사람이 한 유저를 여러번 신고해도 신고 횟수는 1회로 처리하기 때문에 set(repot)를 해준다.

 

4. report 에 있는 원소의 형식이 [신고한사람, 신고당한사람] 이기 때문에 fault[신고당한사람].append(신고한사람) 으로 fault를 완성시켜준다.

 

    for i in id_list:
        if len(fault[i]) >=k:
            result.append(fault[i])

 

5. fault key들 중, value의 길이가 k 이상이면 result 에 value(신고했던 사람)를 넣어준다.

 

    for i in result:
        for j in i:
            result1[j] += 1

 

 

6. result에는 현재 2차원 배열의 형태로 저장되어 있으니, 2중 for문을 돌리고,  key에 맞게 1번씩 올려주며 카운팅해준다.

ex) [['apeach', 'muzi'], ['muzi', 'frodo']]

ex) {'muzi': 2, 'frodo': 1, 'apeach': 1, 'neo': 0}

 

    answer = list(result1.values())

    return answer

7. result1의 모든 value를 list 형식으로 출력하면 통과된다.

 

 

 

3. 메모 (딕셔너리 value만 출력, key만 출력)

딕셔너리명.values()

딕셔너리명.keys()

 

를 이용해서 출력할 수 있다.

dic = {"a" : 1, "b": 2 }

print(dic.values())
print(dic.keys())

#dict_values([1, 2])
#dict_keys(['a', 'b'])

 

list로 변환시켜 주지 않으면 위와 같은 형태로 출력되기 때문에

 

dic = {"a" : 1, "b": 2 }

print(list(dic.values()))
print(list(dic.keys()))

#[1, 2]
#['a', 'b']

 

위와 같이 list()로 감싸서 출력해준다. 

댓글