250x250
Link
λ‚˜μ˜ GitHub Contribution κ·Έλž˜ν”„
Loading data ...
Notice
Recent Posts
Recent Comments
관리 메뉴

Data Science LAB

[Python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ level 3 (λΆˆλŸ‰ μ‚¬μš©μž) λ³Έλ¬Έ

πŸ“ Coding Test/Programmers

[Python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ level 3 (λΆˆλŸ‰ μ‚¬μš©μž)

γ…… γ…œ γ…” γ…‡ 2022. 11. 6. 15:36
728x90

1. 문제 μ„€λͺ…

κ°œλ°œνŒ€ λ‚΄μ—μ„œ μ΄λ²€νŠΈ κ°œλ°œμ„ λ‹΄λ‹Ήν•˜κ³  μžˆλŠ” "무지"λŠ” μ΅œκ·Ό μ§„ν–‰λœ μΉ΄μΉ΄μ˜€μ΄λͺ¨ν‹°μ½˜ μ΄λ²€νŠΈμ— λΉ„정상적인 λ°©λ²•μœΌλ‘œ λ‹Ήμ²¨μ„ μ‹œλ„ν•œ μ‘λͺ¨μžλ“€μ„ λ°œκ²¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ΄λŸ° μ‘λͺ¨μžλ“€μ„ λ”°λ‘œ λͺ¨μ•„ λΆˆλŸ‰ μ‚¬μš©μžλΌλŠ” μ΄λ¦„μœΌλ‘œ λͺ©λ‘μ„ λ§Œλ“€μ–΄μ„œ λ‹Ήμ²¨ μ²˜λ¦¬ μ‹œ μ œμ™Έν•˜λ„둝 μ΄λ²€νŠΈ λ‹Ήμ²¨μž λ‹΄λ‹ΉμžμΈ "ν”„λ‘œλ„" μ—κ²Œ μ „λ‹¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€. μ΄ λ•Œ κ°œμΈμ •λ³΄ λ³΄ν˜Έμ„ μœ„ν•΄ μ‚¬μš©μž μ•„이디 μ€‘ μΌλΆ€ λ¬Έμžλ₯Ό '*' λ¬Έμžλ‘œ κ°€λ €μ„œ μ „λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€. κ°€λ¦¬κ³ μž ν•˜λŠ” λ¬Έμž ν•˜λ‚˜μ— '*' λ¬Έμž ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜μ˜€κ³  μ•„이디 λ‹Ή μ΅œμ†Œ ν•˜λ‚˜ μ΄μƒμ˜ '*' λ¬Έμžλ₯Ό μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
"무지"와 "ν”„λ‘œλ„"λŠ” λΆˆλŸ‰ μ‚¬μš©μž λͺ©λ‘μ— λ§€ν•‘λœ μ‘λͺ¨μž μ•„이디λ₯Ό μ œμž¬ μ•„이디 λΌκ³  λΆ€λ₯΄κΈ°λ‘œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

 

 

 

 

2. μ œν•œ 사항

  • user_id λ°°μ—΄μ˜ ν¬κΈ°λŠ” 1 이상 8 μ΄ν•˜μž…λ‹ˆλ‹€.
  • user_id λ°°μ—΄ 각 μ›μ†Œλ“€μ˜ 값은 길이가 1 이상 8 μ΄ν•˜μΈ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
    • 응λͺ¨ν•œ μ‚¬μš©μž 아이디듀은 μ„œλ‘œ μ€‘λ³΅λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • 응λͺ¨ν•œ μ‚¬μš©μž μ•„μ΄λ””λŠ” μ•ŒνŒŒλ²³ μ†Œλ¬Έμžμ™€ 숫자둜만으둜 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • banned_id λ°°μ—΄μ˜ ν¬κΈ°λŠ” 1 이상 user_id λ°°μ—΄μ˜ 크기 μ΄ν•˜μž…λ‹ˆλ‹€.
  • banned_id λ°°μ—΄ 각 μ›μ†Œλ“€μ˜ 값은 길이가 1 이상 8 μ΄ν•˜μΈ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
    • λΆˆλŸ‰ μ‚¬μš©μž μ•„μ΄λ””λŠ” μ•ŒνŒŒλ²³ μ†Œλ¬Έμžμ™€ 숫자, 가리기 μœ„ν•œ 문자 '*' 둜만 이루어져 μžˆμŠ΅λ‹ˆλ‹€.
    • λΆˆλŸ‰ μ‚¬μš©μž μ•„μ΄λ””λŠ” '*' 문자λ₯Ό ν•˜λ‚˜ 이상 ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
    • λΆˆλŸ‰ μ‚¬μš©μž 아이디 ν•˜λ‚˜λŠ” 응λͺ¨μž 아이디 쀑 ν•˜λ‚˜μ— ν•΄λ‹Ήν•˜κ³  같은 응λͺ¨μž 아이디가 μ€‘λ³΅ν•΄μ„œ 제재 아이디 λͺ©λ‘μ— λ“€μ–΄κ°€λŠ” κ²½μš°λŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • 제재 아이디 λͺ©λ‘λ“€μ„ κ΅¬ν–ˆμ„ λ•Œ 아이디듀이 λ‚˜μ—΄λœ μˆœμ„œμ™€ 관계없이 아이디 λͺ©λ‘μ˜ λ‚΄μš©μ΄ λ™μΌν•˜λ‹€λ©΄ 같은 κ²ƒμœΌλ‘œ μ²˜λ¦¬ν•˜μ—¬ ν•˜λ‚˜λ‘œ μ„Έλ©΄ λ©λ‹ˆλ‹€.

 

 

 

 

 

 

3. λ‚΄ 풀이

from itertools import product
def solution(user_id, banned_id):
    answer = []
    for id in banned_id:
        star = []
        ids = []
        for i,x in enumerate(id):
            if x == '*':
                star.append(i)
        
        for u_id in user_id:
            if len(u_id) == len(id):
                new_id = u_id
                for s in star:
                    new_id = new_id[:s] + '*'+ new_id[s+1:]
                if new_id == id:
                    ids.append(u_id)
                    
        answer.append(ids)
    
    answer = list(product(*answer))
    answer = [sorted(x) for x in answer if len(x) == len(set(x))]
    answer = set(list(map(tuple,answer)))
    
    return len(answer)

 

1. for 문을 μ‚¬μš©ν•˜μ—¬ 제재 μ•„μ΄λ””λ“€μ˜ *의 μœ„μΉ˜λ₯Ό 리슀트둜 생성

2. μœ μ € ID 쀑 제재 ID와 길이가 같은 ID만 *의 μœ„μΉ˜ 리슀트λ₯Ό μ΄μš©ν•˜μ—¬ *둜 λ³€ν™˜ν•¨

3. μƒˆλ‘œ μƒμ„±λœ μœ μ € ID(*둜 λ³€ν™˜)이 제재 ID와 λ™μΌν•˜λ©΄ λ¦¬μŠ€νŠΈμ— μΆ”κ°€ -> λͺ¨λ“  제재 아이디듀 반볡

4. μ΅œμ’…μ μœΌλ‘œ 각 제재 아이디 별 λ§€ν•‘λœ μœ μ €μ•„μ΄λ””λ“€μ΄ λ‹΄κΈ΄ 리슀트 생성

5. product() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‘°ν•© 생성 (answer)

6. 각 μ‘°ν•© 쀑 μ€‘λ³΅λœ μš”μ†Œκ°€ μžˆλŠ” μ‘°ν•© 제거

7. μ΅œμ’… μ„ νƒλœ μ‘°ν•© 쀑 쀑볡 제거 (μˆœμ„œ μƒκ΄€μ—†μœΌλ―€λ‘œ sorted()ν•¨μˆ˜ μ‚¬μš©ν•΄ μ •λ ¬) 

8. μ΅œμ’… 리슀트의 리슀트 길이λ₯Ό λ°˜ν™˜

 

사싀 가독성이 많이 μ’‹μ§€λŠ” μ•Šμ€ 것 κ°™μ•„μ„œ μ‹œκ°„ μ—¬μœ λ  λ•Œ 더 κ³ λ―Όν•΄ 봐야겠닀...

 

 

 

4. λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

from itertools import product

def check(str1, str2):
    if len(str1) != len(str2):
        return False
    for i in range(len(str1)):
        if str1[i] == "*":
            continue
        if str1[i] != str2[i]:
            return False
    return True

def solution(user_id, banned_id):
    answer = set()
    result = [[] for i in range(len(banned_id))]

    for i in range(len(banned_id)):
        for u in user_id:
            if check(banned_id[i], u):
                result[i].append(u)

    result = list(product(*result))
    for r in result:
        if len(set(r)) == len(banned_id):
            answer.add("".join(sorted(set(r))))

    return len(answer)

 

1. 아이디가 λ™μΌν•œμ§€ μ—¬λΆ€λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ 생성

 1) 두 λ¬Έμžμ—΄μ˜ 길이가 λ‹€λ₯΄λ©΄ False

 2) for 문을 μ‚¬μš©ν•˜μ—¬ 첫번째 λ¬Έμžμ—΄ 쀑 '*'이 λ‚˜μ˜€λ©΄ continue, 두 κΈ€μžλΌ 쀑 ν•œκΈ€μžλΌλ„ λ‹€λ₯΄λ©΄ False λ°˜ν™˜

2. answer을 set()으둜 μ„ μ–Έ

3. 결과값을 λ°›λŠ” 2차원 리슀트λ₯Ό banned_list의 길이만큼 생성

4. for문을 μ‚¬μš©ν•˜μ—¬ 제재 ID별 μ•žμ„œ μ„ μ–Έν•œ ν•¨μˆ˜κ°€ True이면 user_idλ₯Ό result λ¦¬μŠ€νŠΈμ— μΆ”κ°€

5. for문을 μ‚¬μš©ν•˜μ—¬ 2차원 리슀트 λ‚΄μ—μ„œ μ€‘λ³΅λœ 리슀트 제거 ν›„ 리슀트 길이 λ°˜ν™˜

728x90
Comments