<문제 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}
for rep in report:
vic, sus = rep.split()
if sus not in id_dic[vic]['v']:
id_dic[sus]['r'] = id_dic[sus]['r'] + 1
id_dic[vic]['v'].append(sus)
변수 | 설명 | 형식 |
---|
r | 신고 당한 횟수 | int |
v | 자신이 신고한 사람들 | list |
m | 받은 메일 횟수 | int |
vic | 신고자 | string |
sus | 피신고자 (신고당한 사람) | string |
- 본인은 먼저 사람 한 명에 대한 정보 (신고 당한 횟수, 신고한 사람들, 받은 메일 횟수)를 모두 기록할 수 있는 'id 딕셔너리'(id_dic)를 만들었다.
- 그 다음 report를 for 문으로 1개씩 불러와(rep) 신고자(vic)와 피신고자(sus)로 분리하였다.
- 그 다음 만약 기존 신고자(vic) 정보 안의 '신고한 사람들' 리스트(v)에 피신고자(sus)가 들어있는지 검사한다.
- 들어있지 않다면 피신고자(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 |
- id_list의 id 순서대로 'id 딕셔너리'(id_dic)의 '신고한 사람들'(v) 리스트 정보를 순서대로 추출한다.
- '신고한 사람들'(v) 리스트에서 추출된 피신고자(v_id)의 정보를 다시 'id 딕셔너리'(id_dic)에서 조회하여 '신고 당한 횟수'(r)의 값을 확인한다.
- '신고 당한 횟수'(r)의 값이 k (여기서는 2) 값 이상이라면 id의 '받은 메일 횟수'(m)에 +1을 한다
- 모든 피신고자(v_id)의 정보를 확인했다면 최종 '받은 메일 횟수'(m) 값을 answer에 추가한다.
answer
[2, 1, 1, 0]
모범 풀이
answer = [0] * len(id_list)
reports = {x : 0 for x in id_list}
- id_list의 크기(len) 만큼 0을 채운 답안 (answer)을 만든다.
- 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
- set을 사용하여 중복 신고자:피신고자 값을 없앤다.
- 중복이 제거된 report 값을 순서대로 추출한다
- split을 통하여 '신고자'와 '피신고자'를 분리한다.
- reports의 '피신고자' 값에 +1을 한다.
reports
{'muzi': 1, 'frodo': 2, 'apeach': 0, 'neo': 2}
for r in set(report):
if reports[r.split()[1]] >= k:
answer[id_list.index(r.split()[0])] += 1
- 중복이 제거된 report 값을 순서대로 추출한다
- split을 통하여 '신고자'와 '피신고자'를 분리한다.
- 피신고자의 신고 건 수(reports의 value)가 k를 넘는지 확인한다.
- 신고 건 수가 k를 넘었을경우 answer의 '신고자' index의 숫자를 +1 한다.
- 아래와 같이 index를 활용하면 리스트에서 변수의 index(위치) 값을 알 수 있다.
id_list.index('apeach')
2
answer
[2, 1, 1, 0]
느낀점
- 중복 제거를 위해서 set을 적극적으로 활용해야겠다.
- reports와 같은 심플한 딕셔너리 형태로 문제를 풀어보도록 노력해야겠다.