Programmers-Lv.1-신고 결과 받기

Chiwoo Song·2022년 4월 13일
0

AlgorithmTraining

목록 보기
1/2

<문제 Link>
https://programmers.co.kr/learn/courses/30/lessons/92334


본인 문제 풀이

# 예시 데이터
id_list = ["muzi", "frodo", "apeach", "neo"]
report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
id_dic = {}
for id in id_list:
    id_dic[id] = {'r':0, 'v':[], 'm':0} #'r : 신고 당한 횟수' , v : 신고한 사람들, m : 받은 메일
for rep in report:
    vic, sus = rep.split() # report를 Split 하여 신고자와 피신고자 나누기
    if sus not in id_dic[vic]['v']: # 신고자의 신고한 사람들 리스트에 피신고자가 없을 경우
        id_dic[sus]['r'] = id_dic[sus]['r'] + 1 # 피신고자의 신고 당한 횟수 + 1
        id_dic[vic]['v'].append(sus) # 신고자의 신고한 사람들 리스트에 피신고자 추가
변수설명형식
r신고 당한 횟수int
v자신이 신고한 사람들list
m받은 메일 횟수int
vic신고자string
sus피신고자 (신고당한 사람)string
  1. 본인은 먼저 사람 한 명에 대한 정보 (신고 당한 횟수, 신고한 사람들, 받은 메일 횟수)를 모두 기록할 수 있는 'id 딕셔너리'(id_dic)를 만들었다.
  2. 그 다음 report를 for 문으로 1개씩 불러와(rep) 신고자(vic)와 피신고자(sus)로 분리하였다.
  3. 그 다음 만약 기존 신고자(vic) 정보 안의 '신고한 사람들' 리스트(v)에 피신고자(sus)가 들어있는지 검사한다.
  4. 들어있지 않다면 피신고자(sus) 정보의 '신고 당한 횟수'(r) 값에 +1을 하고 신고자(vic) 정보의 '신고한 사람들'리스트(v)에 피신고자(sus)를 추가한다.
  • 그렇게 되면 아래와 같이 'id 딕셔너리'(id_dic)가 완성된다.
id_dic
{'muzi': {'r': 1, 'v': ['frodo', 'neo'], 'm': 0},
 'frodo': {'r': 2, 'v': ['neo'], 'm': 0},
 'apeach': {'r': 0, 'v': ['frodo', 'muzi'], 'm': 0},
 'neo': {'r': 2, 'v': [], 'm': 0}}

  • 위에서 만든 'id 딕셔너리'(id_dic)를 활용하여 답안(answer)을 만든다.
answer = []
k = 2
for id in id_list:
    for v_id in id_dic[id]['v']:
        if id_dic[v_id]['r'] >= k:
            id_dic[id]['m'] += 1
    answer.append(id_dic[id]['m'])
변수설명형식
r신고 당한 횟수int
v자신이 신고한 사람들list
m받은 메일 횟수int
  1. id_list의 id 순서대로 'id 딕셔너리'(id_dic)의 '신고한 사람들'(v) 리스트 정보를 순서대로 추출한다.
  2. '신고한 사람들'(v) 리스트에서 추출된 피신고자(v_id)의 정보를 다시 'id 딕셔너리'(id_dic)에서 조회하여 '신고 당한 횟수'(r)의 값을 확인한다.
  3. '신고 당한 횟수'(r)의 값이 k (여기서는 2) 값 이상이라면 id의 '받은 메일 횟수'(m)에 +1을 한다
  4. 모든 피신고자(v_id)의 정보를 확인했다면 최종 '받은 메일 횟수'(m) 값을 answer에 추가한다.

answer
[2, 1, 1, 0]
  • 정답이 나온다.



모범 풀이

  • 다른 개발자들의 풀이법이다.
answer = [0] * len(id_list)   
reports = {x : 0 for x in id_list}
  1. id_list의 크기(len) 만큼 0을 채운 답안 (answer)을 만든다.
  2. id_list에서 id(x)를 key 값으로 두고 value를 0으로 두는 딕셔너리 (report) 를 만든다.
reports
{'muzi': 0, 'frodo': 0, 'apeach': 0, 'neo': 0}
  • 그럼 위와 같은 딕셔너리 reports 가 만들어진다.

for r in set(report):
    reports[r.split()[1]] += 1
  1. set을 사용하여 중복 신고자:피신고자 값을 없앤다.
  2. 중복이 제거된 report 값을 순서대로 추출한다
  3. split을 통하여 '신고자'와 '피신고자'를 분리한다.
  4. reports의 '피신고자' 값에 +1을 한다.
  • 아래와 같이 reports 가 만들어진다.
reports
{'muzi': 1, 'frodo': 2, 'apeach': 0, 'neo': 2}

for r in set(report):
    if reports[r.split()[1]] >= k: # 피신고자의 신고 건수가 k를 넘는지 확인
        answer[id_list.index(r.split()[0])] += 1 # 넘었을 경우 신고자의 메일 수신 횟수 + 1
  1. 중복이 제거된 report 값을 순서대로 추출한다
  2. split을 통하여 '신고자'와 '피신고자'를 분리한다.
  3. 피신고자의 신고 건 수(reports의 value)가 k를 넘는지 확인한다.
  4. 신고 건 수가 k를 넘었을경우 answer의 '신고자' index의 숫자를 +1 한다.
  • 아래와 같이 index를 활용하면 리스트에서 변수의 index(위치) 값을 알 수 있다.
id_list.index('apeach')
2

  • 아래와 같이 답이 나온다.
answer
[2, 1, 1, 0]

느낀점

  1. 중복 제거를 위해서 set을 적극적으로 활용해야겠다.
  2. reports와 같은 심플한 딕셔너리 형태로 문제를 풀어보도록 노력해야겠다.
profile
Shallow but broad knowledge

0개의 댓글

Powered by GraphCDN, the GraphQL CDN