코딩테스트 연습 | 신고 결과 받기 | 2022 KAKAO BLIND RECRUITMENT | Python

2022. 5. 3. 23:39·👨‍💻 Dev Note/코딩테스트
반응형

문제 설명

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

 

각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.

  • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
  • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.

k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.

  • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.

유저 ID 유저가 신고한 ID 설명
"muzi" "frodo" "muzi"가 "frodo"를 신고했습니다.
"apeach" "frodo" "apeach"가 "frodo"를 신고했습니다.
"frodo" "neo" "frodo"가 "neo"를 신고했습니다.
"muzi" "neo" "muzi"가 "neo"를 신고했습니다.
"apeach" "muzi" "apeach"가 "muzi"를 신고했습니다.

각 유저별로 신고당한 횟수는 다음과 같습니다.

유저 ID 신고당한 횟수
"muzi" 1
"frodo" 2
"apeach" 0
"neo" 2

위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.

유저 ID 유저가 신고한 ID 정지된 ID
"muzi" ["frodo", "neo"] ["frodo", "neo"]
"frodo" ["neo"] ["neo"]
"apeach" ["muzi", "frodo"] ["frodo"]
"neo" 없음 없음

 

따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.


[문제]

이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

[제한사항]

  • 2 ≤ id_list의 길이 ≤ 1,000
    1 ≤ id_list의 원소 길이 ≤ 10
    id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.
    id_list에는 같은 아이디가 중복해서 들어있지 않습니다.
  • 0 ≤report의 길이 ≤ 200,000
    3 ≤ report의 원소 길이 ≤ 21
    report의 원소는 "이용자id 신고한id"형태의 문자열입니다.
    예를 들어 "muzi frodo"의 경우 "muzi"가 "frodo"를 신고했다는 의미입니다.
    id는 알파벳 소문자로만 이루어져 있습니다.
    이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다.
    자기 자신을 신고하는 경우는 없습니다.
  • 1 ≤k ≤ 200,k는 자연수입니다.
  • return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.

 

[입출력 예시와 설명]

id_list report k result
["muzi", "frodo", 
"apeach", "neo"]
["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] 2 [2,1,1,0]
["con", "ryan"] ["ryan con", "ryan con", "ryan con", "ryan con"] 3 [0,0]

입출력 예 #1

  • 문제의 예시와 같습니다.

입출력 예 #2

  • "ryan"이 "con"을 4번 신고했으나, 주어진 조건에 따라 한 유저가 같은 유저를 여러 번 신고한 경우는 신고 횟수 1회로 처리합니다. 따라서 "con"은 1회 신고당했습니다. 3번 이상 신고당한 이용자는 없으며, "con"과 "ryan"은 결과 메일을 받지 않습니다. 따라서 [0, 0]을 return 합니다.

[제한시간 안내]

  • 정확성 테스트: 10초

[문제풀이]

이 문제의 핵심은 report의 중복제거를 어떻게 효율적으로 할 수 있는지에 대한 부분이었다고 생각한다. 이전 포스팅에서 (물론 자바스크립트의 내용이긴 하지만 결은 비슷하다) Set에 관한 내용을 정리해 두었으니, 해당 부분을 참고하면 도움이 될 것이다.

def getReportedUser(report):
    """
    Report 리스트의 중복을 제거한다.
    set이 아니라 다른 방식으로 구현하려고 하면 왠만해선 시간 초과 오류가 난다.
    """
    no_duplicate = set(report)
    result = {}
    
    """
    신고를 당한사람: Reported, 신고한사람을 Reporter라고 칭한다.
    원본 Report를 {Reported: [Reporter1, Reporter2...]}형태의 Object로 바꾼다.
    """
    for item in no_duplicate:
        split_item = item.split(' ')
        reporter = split_item[0]
        reported = split_item[1]

        if reported not in result:
            result[reported] = [reporter]
        else:
            result[reported].append(reporter)

    return result


def solution(id_list, report, k):
    """
    id_list의 길이 만큼의 0으로 구성된 배열을 만든다.
    예: id_list가 4명일 경우, [0,0,0,0]
    """
    answer = [0 for i in range(len(id_list))]
    
    # {Reported: [Reporter1, Reporter2...]}형태의 Object를 list로 감싼다
    reported_user = list(getReportedUser(report).items())

    """
    reported(신고당한사람)의 reporter(신고한사람)가 k 이상일 경우
    answer의 index번째 카운트를 1 증가시킨다.
    """
    for idx in range(len(reported_user)):
        if len(reported_user[idx][1]) >= k:
            ids = reported_user[idx][1]
            for id in ids:
                index = id_list.index(id)
                answer[index] = answer[index] + 1

    return answer
반응형
저작자표시 비영리 변경금지 (새창열림)

'👨‍💻 Dev Note > 코딩테스트' 카테고리의 다른 글

코딩테스트 연습 | 키패드 누르기 | 2020 카카오 인턴쉽 | python  (0) 2022.05.07
코딩테스트 연습 | 없는 숫자 더하기 | 월간 코드 챌린지 시즌3 | python  (0) 2022.05.06
코딩테스트 연습 | 숫자 문자열과 영단어 | 2021 카카오 채용연계형 인턴십 | python  (0) 2022.05.05
코딩테스트 연습 | 로또의 최고 순위와 최저 순위 | 2021 Dev-Matching: 웹 백엔드 개발자(상반기) | Python  (0) 2022.05.04
코딩테스트 연습 | 신규 아이디 추천 | 2021 KAKAO BLIND RECRUITMENT | Python  (0) 2022.05.02
'👨‍💻 Dev Note/코딩테스트' 카테고리의 다른 글
  • 코딩테스트 연습 | 없는 숫자 더하기 | 월간 코드 챌린지 시즌3 | python
  • 코딩테스트 연습 | 숫자 문자열과 영단어 | 2021 카카오 채용연계형 인턴십 | python
  • 코딩테스트 연습 | 로또의 최고 순위와 최저 순위 | 2021 Dev-Matching: 웹 백엔드 개발자(상반기) | Python
  • 코딩테스트 연습 | 신규 아이디 추천 | 2021 KAKAO BLIND RECRUITMENT | Python
수피리
수피리
다양한 시도를 통해, 나만의 방식과 감각을 찾는 중
  • 수피리
    경험기록 아카이브
    수피리
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • 🌿 My Side B (10)
        • 🏕️ 캠핑 (1)
        • 🍜 맛집 탐방 (3)
        • ✍️ 블로그 전략 (3)
        • 🏋️‍♀️ 운동 (1)
        • 📖 기원 이야기 (2)
      • 📝 Tips (7)
        • 💻 Tech Tips (4)
        • ⚒️ Tool Tips (3)
        • 🧠 Life Tips (0)
      • 👨‍💻 Dev Note (36)
        • 알쓸신개 (0)
        • JavaScript (8)
        • TypeScript (5)
        • React (3)
        • 디자인패턴 (10)
        • Git (2)
        • Redis (1)
        • 코딩테스트 (7)
  • 인기 글

  • 최근 글

  • 태그

    코딩테스트 연습
    자바스크립트
    designpatterns
    TypeScript
    타입스크립트
    디자인패턴
    javascript
    designPattern
    Programming
    코딩테스트
  • hELLO· Designed By정상우.v4.10.3
수피리
코딩테스트 연습 | 신고 결과 받기 | 2022 KAKAO BLIND RECRUITMENT | Python
상단으로

티스토리툴바