[코딩테스트] 프로그래머스 : 신고 결과 받기

김은지·2022년 6월 10일
0

코딩테스트

목록 보기
9/17

문제링크

오늘의 문제 신고결과 받기

지난번에 풀었던 다트게임보다는 쉽다고 생각하고 시작했지만 생각보다 시간이 걸렸다.

첫 번째 제출한 답은 아래와 같다.

def solution(id_list, report, k):
    s = [i.split(' ') for i in set(report)]
    
    #신고 당한 사람 : 신고당한 횟수를 딕셔너리로 저장하기
    d = {}
    for i in s :
      if i[1] in d:
        d[i[1]] += 1
      else:
        d[i[1]] = 1
	
    #신고 횟수를 초과하는 사람의 이름을 리스트로 만들기
    l = [i for i in d.keys() if d[i] >= k]
  	
    #이메일 받을 유저 (중복)저장
    email = []
    for i in s:
      if i[1] in l:
        email += [i[0]]
	
    #각각의 유저가 이메일을 받은 횟수 저장
    answer = [email.count(i) for i in id_list]
      
    return answer

코드 수행 시간이 너무 오래 걸리는 것 같아서 수정한 답은 아래와 같다.

def solution(id_list, report, k):
    reporter      = []
    reported      = []
    reported_time = {}
    emailed       = []
    answer        = []

    for i in set(report):
      reporter += [str(i.split(' ')[0])]
      reported += [str(i.split(' ')[1])]

    for someone in reported:
      if someone in reported_time:
        reported_time[someone] += 1 
      else: 
        reported_time[someone] = 1
  
    for i in range(len(reported)):
      if reported_time[reported[i]] >= k:
        emailed += [reporter[i]]

    for user in id_list:
        answer += [emailed.count(user)]

    return answer 

속도에서는 첫 번째 쓴 코드보다는 개선이 많이 되었다.
답을 수정한 후에도 이것 저것 고치며 속도를 테스트 해봤는데,
어떤 경우는 개선되고, 어떤 경우는 악화되고 해서 뭐가 영향을 미치는건지 모르겠다.
다만 첫 번째 경우는 변수 이름을 너무 마구잡이로 지어서 나도 보기 헷갈리는데,
수정한 후에는 그래도 이해할만 한 것 같다.

오늘의 기억하고 싶은 코드는...
일단 set로 중복을 없애는 것 - 지난번에 다른 분 코드에서 보고 기억하고 있었다.
dictionary에 키가 있고, 없을 때를 구분해서 키를 추가하고 값을 할당하는 것과, 있는 값을 갱신하는 코드이다.
아래의 코드는 키가 있으면 값에 +1 하고, 없으면 키를 추가하고 값을 1로 초기화 하는 것이다.

dict = {}
for key in keys:
  if key in dict:
    dict[key] += 1 
  else: 
    dict[key] = 1

간단하지만 떠올리니 막상 떠오르지 않아서...
오늘도 슨배림들의 답 몇 개를 가져왔다.

def solution(id_list, report, k):
    answer = [0] * len(id_list) 
    #딕셔너리 컴프리헨션이라니 몰랐었어...
    reports = {x : 0 for x in id_list}
	
    #와...신고당한 횟수 더하기
    for r in set(report):
        reports[r.split()[1]] += 1
	
    # 생각만으로 index를 쓰면 더 느려지지 않을까 싶어서 무심코 생략했는데,
    # 실제로 구현 된 걸 보니 내가 이렇게 쓸 수 있을까 싶고
    # 내 코드도 고쳐봐야겠다.
    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer

def solution(id_list, report, k):
    answer = []
    a = list(set(report))
    dictionary2 = {name : 0 for name in id_list}
    dictionary = {name : [] for name in id_list}
    
    #dictionary 만들기 참고^_^
    for i in a:
        dictionary[i.split()[1]].append(i.split()[0])

    for i in dictionary:
        if len(dictionary[i]) >= k:
            for j in dictionary[i]:
                dictionary2[j] += 1

    for i in dictionary2:
        answer.append(dictionary2[i])

    return answer

0개의 댓글