코테 스터디: Week2 02

이슬비·2022년 4월 27일
0

Coding Test

목록 보기
2/6
post-thumbnail

카카오... 진짜 쉽지 않다... 예전에 한창 프로그래머스 풀 때도 카카오는 난이도 1인 문제도 꽤나 시간이 걸렸다... 사실 이번에는 내가 완전히 풀었다고 할 수 없는 게, 이거 !!! 뭔가 set이라는 초기화값(?)만 있으면 될 것 같은데 !!! 하다가 사알짝 구글링을 곁들여 완성했다. 그 말은... 난 카카오 코테는 망할 거라는 것 ~~ ...

1. 문제

이 문제랑 난이도 2인 문제랑 선택할 수 있었는데, 난이도 1 풀어보고 시간 나면 2도 풀어야지 ~~ 했다가 난이도 1 푸는데 시간을 탈탈 써버렸다.
https://programmers.co.kr/learn/courses/30/lessons/92334/solution_groups?language=python3

카카오 코테는 내가 느끼기에 문제를 되게 실용적이게 낸다고 해야하나...? 뭔가 어쩌면 실사용이 가능할 수도 ~? 이런 느낌의 문제를 내는 것 같다. 그래서 코테 초짜인 나에겐 쉽지 않을 수도,,,

2. 풀이

1. (지분 90%의) 내 풀이: 성공

from collections import defaultdict

id = ["muzi", "frodo", "apeach", "neo"]
report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
k = 3

def solution(id_list, report, k):
    cnt = defaultdict(int)
    reports = defaultdict(set)
    answer = [0 for _ in range(len(id_list))]

    for x in report:
        person, reported = x.split()
        reports[person].add(reported)

    for x in reports.values():
        for y in x:
            count_d[y] += 1

    for idx, x in enumerate(id_list):
        for y in reports[x]:
            if cnt[y] >= k:
                answer[idx] += 1

    return answer
    
print(solution(id, report, k))

이번 문제를 풀면서 defaultdict이라는 새로운 자료구조(?)를 알게 되었다.

Defaultdict
: dict의 value 값의 초기 형태를 지정해주는 것!

예를 들어

reports = defaultdict(set)

라고 정의하면 모든 코드를 다 돌고나서 이를 찍어보면,

이런 식으로 출력이 된다! 그럼 코드를 한 번 자세히 살펴보쟈.


def solution(id_list, report, k):
    cnt = defaultdict(int)
    reports = defaultdict(set)
    answer = [0 for _ in range(len(id_list))]

먼저 신고 접수 횟수를 받을 cnt를 int로 초기화해주고(만약 아무런 값도 넣어주지 않으면 0으로 초기화), report는 set으로 초기화 해준다.
이 문제처럼 각각의 counting이 필요할 때는 0으로 초기화한 리스트를 만들어두는 게 여러모로 좋은 것 같다.

for x in report:
    person, reported = x.split()
    reports[person].add(reported)

인수 report를 하나씩 돌면서 신고한 사람과 신고 받은 사람을 나눈다. 이때 신고자는 여러 명을 신고할 수 있으므로 set의 add를 통해 추가!

for x in reports.values():
    for y in x:
        cnt[y] += 1

위에 defalutdic이 어떤 식으로 찍히는지 확인해보면, 각 key 값마다 set이 value로 걸려있다. 그러므로 values만 돌면서 신고당한 사람을 count 해준다. 이것의 결과값은,

이런 식으로 출력된다.

for idx, x in enumerate(id_list):
   for y in reports[x]:
      if cnt[y] >= k:
         answer[idx] += 1

return answer

마지막으로 id_list와 reports를 함께 돌면서 k값과 비교해준다. 이 과정을 통해서 신고 당한 사람이 정말 계정을 정지(?) 당할 것인지의 여부가 결정된다. 그리고 이 값을 answer의 해당 인덱스에 1을 더해주면 끝!

사실 이걸 풀었지만 풀었다고 말할 수도 없고,,, 굉장히 굉장히 찝찝하다. ^^ 그래도 전체적인 로직은... 내가 한 걸..

3. 다른 풀이

프로그래머스의 다른 풀이를 보다보면 정말 경이롭다 !!! 세상에는 참 멋진 사람들이 많은 것 같다.

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

    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer

깔끔하다... 나도 이런 멋진 코드를 작성할 수 있도록... 열심히 공부하기!

profile
정말 알아?

0개의 댓글