πŸ“Œ 파이썬 μœΌλ‘œ 풀이

 

πŸ“Œ λ¬Έμ œ 링크 :

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

πŸ“Œ λ¬Έμ œ μ„€λͺ… :

μ‹ μž…μ‚¬μ› λ¬΄μ§€λŠ” κ²Œμ‹œνŒ λΆˆλŸ‰ 이용자λ₯Ό μ‹ κ³ ν•˜κ³  처리 κ²°κ³Όλ₯Ό λ©”μΌλ‘œ λ°œμ†‘ν•˜λŠ” μ‹œμŠ€ν…œμ„ κ°œλ°œν•˜λ € ν•©λ‹ˆλ‹€. 무지가 κ°œλ°œν•˜λ €λŠ” μ‹œμŠ€ν…œμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 각 μœ μ €λŠ” ν•œ λ²ˆμ— ν•œ λͺ…μ˜ μœ μ €λ₯Ό μ‹ κ³ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ‹ κ³  νšŸμˆ˜μ— μ œν•œμ€ μ—†μŠ΅λ‹ˆλ‹€. μ„œλ‘œ λ‹€λ₯Έ μœ μ €λ₯Ό κ³„μ†ν•΄μ„œ μ‹ κ³ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν•œ μœ μ €λ₯Ό μ—¬λŸ¬ 번 μ‹ κ³ ν•  μˆ˜λ„ μžˆμ§€λ§Œ, λ™μΌν•œ μœ μ €μ— λŒ€ν•œ μ‹ κ³  νšŸμˆ˜λŠ” 1회둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.
  • k번 이상 μ‹ κ³ λœ μœ μ €λŠ” κ²Œμ‹œνŒ 이용이 μ •μ§€λ˜λ©°, ν•΄λ‹Ή μœ μ €λ₯Ό μ‹ κ³ ν•œ λͺ¨λ“  μœ μ €μ—κ²Œ μ •μ§€ 사싀을 λ©”μΌλ‘œ λ°œμ†‘ν•©λ‹ˆλ‹€.
    • μœ μ €κ°€ μ‹ κ³ ν•œ λͺ¨λ“  λ‚΄μš©μ„ μ·¨ν•©ν•˜μ—¬ λ§ˆμ§€λ§‰μ— ν•œκΊΌλ²ˆμ— κ²Œμ‹œνŒ 이용 μ •μ§€λ₯Ό μ‹œν‚€λ©΄μ„œ μ •μ§€ 메일을 λ°œμ†‘ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ 전체 μœ μ € λͺ©λ‘μ΄ ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 μ‹ κ³ λ‹Ήν•˜λ©΄ 이용 μ •μ§€)인 경우의 μ˜ˆμ‹œμž…λ‹ˆλ‹€.

각 μœ μ €λ³„λ‘œ μ‹ κ³ λ‹Ήν•œ νšŸμˆ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” 2번 이상 μ‹ κ³ λ‹Ήν•œ "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μ—λŠ” 같은 아이디가 μ€‘λ³΅ν•΄μ„œ λ“€μ–΄μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 1 ≤ 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λ§ˆλ‹€ 메일 받을 횟수λ₯Ό id μˆœμ„œλŒ€λ‘œ 정리해 λ°°μ—΄λ‘œ 리턴!

**** 같은 μ‚¬λžŒμ΄ μ‹ κ³ ν•œ 뢀뢄에 λŒ€ν•΄ 신경쓸것! 

 

 

μ†ŒμŠ€μ½”λ“œ) 

* 1μ°¨) 정확도 단 8.3점 또λ₯΄λ₯΄

def solution(id_list, report, k):
    mail_receivers = []
    result = [ 0 for one in id_list ]
    declare_dict = {}
    for one in report:
        declare_from, declare_to = one.split(" ")
        if declare_to in declare_dict :
            declare_dict.get(declare_to).append(declare_from)
        else :
            declare_dict[declare_to] = [declare_from]

    for key, value in declare_dict.items() :
        value_list = list(set(value))
        if len(value_list) >= k :
            for one in value :
                mail_receivers.append(one)

    for receiver in mail_receivers :
        for i in range(len(id_list)) :
            if receiver == id_list[i] :
                result[i] += 1

    return result

*2μ°¨) μ‹€νŒ¨ : 단 ν•˜λ‚˜μ˜ μ‹œκ°„μ΄ˆκ³Ό γ… 

def declaration(id_list, report, k):
    mail_receivers = []
    result = [ 0 for one in id_list ]
    declare_dict = {}
    for one in report:
        declare_from, declare_to = one.split(" ")                   # μ‹ κ³ μžμ™€ μ‹ κ³ λŒ€μƒμ„ λ‚˜λˆ”

        if declare_to in declare_dict :                             # μ‹ κ³  λ‚΄μ—­ 확인
            if declare_from not in declare_dict[declare_to] :       # λ™μΌν•œ μ‹ κ³ μžλŠ” μ œμ™Έ
                declare_dict.get(declare_to).append(declare_from)   # μ‹ κ³ μž λ°°μ—΄ κ°€μ Έμ™€μ„œ μΆ”κ°€
        else :
            declare_dict[declare_to] = [declare_from]

    for key, value in declare_dict.items() :
        if len(value) >= k :
            for one in value :
                mail_receivers.append(one)

    for receiver in mail_receivers :
        for i in range(len(id_list)) :
            if receiver == id_list[i] :
                result[i] += 1

    return result

*3μ°¨) 성곡

def solution(id_list, report, k):

    declare_dict = {}
    for one in report:
        declare_from, declare_to = one.split(" ")                   # μ‹ κ³ μžμ™€ μ‹ κ³ λŒ€μƒμ„ λ‚˜λˆ”

        if declare_to in declare_dict :                             # μ‹ κ³  λ‚΄μ—­ 확인
            if declare_from not in declare_dict[declare_to] :       # λ™μΌν•œ μ‹ κ³ μžλŠ” μ œμ™Έ
                declare_dict.get(declare_to).append(declare_from)   # μ‹ κ³ μž λ°°μ—΄ κ°€μ Έμ™€μ„œ μΆ”κ°€
        else :
            declare_dict[declare_to] = [declare_from]

    mail_receivers = []
    for key, value in declare_dict.items() :
        if len(value) >= k :
            mail_receivers.extend(value)

    result = []
    for id in id_list :
        result.append(mail_receivers.count(id))

    return result

 

 

리뷰) 

1μ°¨ ν”Όλ“œλ°±)

μ‹ κ³ λŒ€μƒμ„ ν‚€λ‘œ λ§Œλ“€κ³  μ‹ κ³ μžλ₯Ό λ°°μ—΄λ‘œ λ§Œλ“€μ–΄ λ§΅ν•‘μ‹œμΌ°λŠ”λ°, 쀑간에 μ‹ κ³ μž λ°°μ—΄μ—μ„œ μ‹ κ³ λŒ€μƒμ„ μ°ΎλŠ” μ‹€μˆ˜λ₯Ό ;

그리고 같은 μ‚¬λžŒμ΄ μ—¬λŸ¬λ²ˆ μ‹ κ³ ν–ˆμ„ λ•Œμ˜ μ²˜λ¦¬λ„ ν•΄μ£Όμ§€ λͺ»ν•¨.

2μ°¨ ν”Όλ“œλ°±)

ν•œκ±΄μ˜ μ‹œκ°„ μ΄ˆκ³Όκ°€ μžˆλŠ”λ° λ©”μΌλ¦¬μ‹œλ²„ μ •λ¦¬ν• λ•Œ for문을 λŒλ €μ„œ appendν•œκ±°λ³΄λ‹€ extend둜 ν•œλ°©μ— λΆ™μ΄λ‹ˆ μ‹œκ°„ 초과 ν•΄κ²°ν–ˆλ‹€!

+ Recent posts