λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/Programmers

[Programmers] μ‹ κ³  κ²°κ³Ό λ°›κΈ°

 

문제 

 

문제 μ„€λͺ…

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

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

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

 

"muzi" "frodo" "muzi"κ°€ "frodo"λ₯Ό μ‹ κ³ ν–ˆμŠ΅λ‹ˆλ‹€.
"apeach" "frodo" "apeach"κ°€ "frodo"λ₯Ό μ‹ κ³ ν–ˆμŠ΅λ‹ˆλ‹€.
"frodo" "neo" "frodo"κ°€ "neo"λ₯Ό μ‹ κ³ ν–ˆμŠ΅λ‹ˆλ‹€.
"muzi" "neo" "muzi"κ°€ "neo"λ₯Ό μ‹ κ³ ν–ˆμŠ΅λ‹ˆλ‹€.
"apeach" "muzi" "apeach"κ°€ "muzi"λ₯Ό μ‹ κ³ ν–ˆμŠ΅λ‹ˆλ‹€.

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

 

"muzi" 1
"frodo" 2
"apeach" 0
"neo" 2

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” 2번 이상 μ‹ κ³ λ‹Ήν•œ "frodo"와 "neo"의 κ²Œμ‹œνŒ 이용이 μ •μ§€λ©λ‹ˆλ‹€. μ΄λ•Œ, 각 μœ μ €λ³„λ‘œ μ‹ κ³ ν•œ 아이디와 μ •μ§€λœ 아이디λ₯Ό μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

"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 ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

 

 

λ‚˜μ˜ μ½”λ“œ 
def solution(id_list, report, k):
    arr = []
    hashmap = {}
    answer = []
    imp = []
    cnt = 0
    
    # report λ°°μ—΄ 이차원 λ°°μ—΄λ‘œ λ§Œλ“€κΈ° (같은 μ‚¬λžŒμ΄ 같은 μ‚¬λžŒ μ‹ κ³ ν•œ 쀑볡 경우 μ œμ™Έ)
    for rep in report:
        repo = rep.split(" ")
        arr.append(repo)
        if arr.count(repo) > 1:
            arr.pop()
    print(arr) 
    
    # hashmap으둜 각 인물당 μ‹ κ³ κ°€ λͺ‡λ²ˆλλŠ”지 νŒŒμ•…ν•˜κΈ° 
    for i in range(len(arr)):
        if arr[i][1] in hashmap:
            hashmap[arr[i][1]] += 1
        else:
            hashmap[arr[i][1]] = arr[i][1].count(arr[i][1])
    
    # 신고받은 νšŸμˆ˜κ°€ k 이상인 경우만 배열에 μΆ”κ°€  
    for key in hashmap.keys():
        if hashmap[key] >= k:
            imp.append(key)
    print(imp)
    
    # μˆ˜μ •λœ μ‹ κ³ λ¦¬μŠ€νŠΈλ₯Ό λ°”νƒ•μœΌλ‘œ 메일 λ°œμ†‘ 횟수 κ΅¬ν•˜κΈ° 
    for id in id_list:
        for t in range(len(arr)):
            if id == arr[t][0]:
                if arr[t][1] in imp:
                    cnt += 1
                else:
                    continue
        answer.append(cnt)
        cnt = 0
    return answer
뢄석 > 이 μ½”λ“œμ˜ 경우 report의 길이가 μ΅œλŒ€μΌ λ•Œ μ΅œλŒ€ 400μ–΅λ²ˆ 돌기 λ•Œλ¬Έμ— μ‹œκ°„μ΄ˆκ³Όκ°€ λœ¬λ‹€. 그러기 λ•Œλ¬Έμ— 브루트포슀둜 ν’€λ©΄ μ•ˆλœλ‹€λŠ” 것을 κΉ¨λ‹¬μ—ˆλ‹€. 

 

 

ν•΄μ„€ μ½”λ“œ 
def solution(id_list, report, k):
    
    reported_cnt = {x:0 for x in id_list}
    recieved_mail_cnt = [0] * len(id_list)
    
    for r in set(report):
        reported_cnt[r.split()[1]] += 1
    
    for r in set(report):
        if reported_cnt[r.split()[1]] >= k:
            recieved_mail_cnt[id_list.index(r.split()[0])] += 1
    return recieved_mail_cnt
뢄석 > μš°μ„  μ‹ κ³  λˆ„μ  횟수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•΄μ‹œλ§΅μ„ 미리 0으둜 μ΄ˆκΈ°ν™”ν•˜κ³  메일을 λ°›λŠ” 횟수 λ˜ν•œ id_listλ₯Ό κΈ°μ€€μœΌλ‘œ 0으둜 μ΄ˆκΈ°ν™” μ‹œν‚¨λ‹€. 그리고 ν•œ μ‚¬λžŒμ΄ 같은 μ‚¬λžŒμ„ μ—¬λŸ¬λ²ˆ μ‹ κ³ ν•œ 것은 μ œμ™Έν•˜κΈ° μœ„ν•΄ set(report)둜 λ°˜λ³΅λ¬Έμ„ 돌리고 예λ₯Ό λ“€μ–΄ "muzi(μ‹ κ³ ν•œ μ‚¬λžŒ) appeach(μ‹ κ³  받은 μ‚¬λžŒ)" 이 r둜 λ“€μ–΄μ˜€λ©΄ 각각 r.split()[0],r.split()[1] 둜 λ‚˜νƒ€λ‚΄μ–΄ ν•΄μ‹œλ§΅μ— μΆ”κ°€ν•œλ‹€. μ΄μ–΄μ„œ ν•΄μ‹œλ§΅μ˜ key 값이 λ˜λŠ” 신고받은 μ‚¬λžŒ(r.split()[1])으둜 λˆ„μ νšŸμˆ˜κ°€ k이상인 경우만 1을 μ¦κ°€μ‹œμΌœμ€€λ‹€. 

 

 

 

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μ‹ κ³  κ²°κ³Ό λ°›κΈ°

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

programmers.co.kr