algorithm

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ level1] μ‹€νŒ¨μœ¨ - 파이썬

HANBEEN 2021. 6. 19. 02:20
λ°˜μ‘ν˜•

πŸ’‘ 문제 μ„€λͺ…

슈퍼 κ²Œμž„ 개발자 μ˜€λ λ¦¬λŠ” 큰 고민에 λΉ μ‘Œλ‹€. κ·Έλ…€κ°€ λ§Œλ“  ν”„λ Œμ¦ˆ μ˜€μ²œμ„±μ΄ λŒ€μ„±κ³΅μ„ κ±°λ’€μ§€λ§Œ, μš”μ¦˜ μ‹ κ·œ μ‚¬μš©μžμ˜ μˆ˜κ°€ κΈ‰κ°ν•œ 것이닀. 원인은 μ‹ κ·œ μ‚¬μš©μžμ™€ κΈ°μ‘΄ μ‚¬μš©μž 사이에 μŠ€ν…Œμ΄μ§€ 차이가 λ„ˆλ¬΄ 큰 것이 λ¬Έμ œμ˜€λ‹€.

이 문제λ₯Ό μ–΄λ–»κ²Œ ν• κΉŒ κ³ λ―Ό ν•œ κ·Έλ…€λŠ” λ™μ μœΌλ‘œ κ²Œμž„ μ‹œκ°„μ„ λŠ˜λ €μ„œ λ‚œμ΄λ„λ₯Ό μ‘°μ ˆν•˜κΈ°λ‘œ ν–ˆλ‹€. μ—­μ‹œ 슈퍼 개발자라 λŒ€λΆ€λΆ„μ˜ λ‘œμ§μ€ μ‰½κ²Œ κ΅¬ν˜„ν–ˆμ§€λ§Œ, μ‹€νŒ¨μœ¨μ„ κ΅¬ν•˜λŠ” λΆ€λΆ„μ—μ„œ μœ„κΈ°μ— 빠지고 λ§μ•˜λ‹€. 였렐리λ₯Ό μœ„ν•΄ μ‹€νŒ¨μœ¨μ„ κ΅¬ν•˜λŠ” μ½”λ“œλ₯Ό μ™„μ„±ν•˜λΌ.

  • μ‹€νŒ¨μœ¨μ€ λ‹€μŒκ³Ό 같이 μ •μ˜ν•œλ‹€.
    • μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν–ˆμœΌλ‚˜ 아직 ν΄λ¦¬μ–΄ν•˜μ§€ λͺ»ν•œ ν”Œλ ˆμ΄μ–΄μ˜ 수 / μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν•œ ν”Œλ ˆμ΄μ–΄ 수

전체 μŠ€ν…Œμ΄μ§€μ˜ 개수 N, κ²Œμž„μ„ μ΄μš©ν•˜λŠ” μ‚¬μš©μžκ°€ ν˜„μž¬ λ©ˆμΆ°μžˆλŠ” μŠ€ν…Œμ΄μ§€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ stagesκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ‹€νŒ¨μœ¨μ΄ 높은 μŠ€ν…Œμ΄μ§€λΆ€ν„° λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μŠ€ν…Œμ΄μ§€μ˜ λ²ˆν˜Έκ°€ λ‹΄κ²¨μžˆλŠ” 배열을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜λΌ.

πŸ’‘ μ œν•œμ‚¬ν•­

  • μŠ€ν…Œμ΄μ§€μ˜ 개수 N은 1 μ΄μƒ 500 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.
  • stages의 κΈΈμ΄λŠ” 1 μ΄μƒ 200,000 μ΄ν•˜μ΄λ‹€.
  • stagesμ—λŠ” 1 μ΄μƒ N + 1 μ΄ν•˜μ˜ μžμ—°μˆ˜κ°€ λ‹΄κ²¨μžˆλ‹€.
    • 각 μžμ—°μˆ˜λŠ” μ‚¬μš©μžκ°€ ν˜„μž¬ 도전 쀑인 μŠ€ν…Œμ΄μ§€μ˜ 번호λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
    • 단, N + 1 μ€ λ§ˆμ§€λ§‰ μŠ€ν…Œμ΄μ§€(N 번째 μŠ€ν…Œμ΄μ§€) κΉŒμ§€ 클리어 ν•œ μ‚¬μš©μžλ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • λ§Œμ•½ μ‹€νŒ¨μœ¨μ΄ 같은 μŠ€ν…Œμ΄μ§€κ°€ μžˆλ‹€λ©΄ μž‘μ€ 번호의 μŠ€ν…Œμ΄μ§€κ°€ λ¨Όμ € μ˜€λ„λ‘ ν•˜λ©΄ λœλ‹€.
  • μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν•œ μœ μ €κ°€ μ—†λŠ” 경우 ν•΄λ‹Ή μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ€ 0 μœΌλ‘œ μ •μ˜ν•œλ‹€.

πŸ’‘ λ‚˜μ˜μ½”λ“œ

처음 생각해낸 방법은 1λΆ€ν„° N+1κΉŒμ§€ for문을 λŒλ¦¬λ©΄μ„œ stages λ¦¬μŠ€νŠΈμ— i λ§ˆλ‹€ count ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬

stages.count(i) / len(stages) ν•΄μ£ΌλŠ” 방법을 μƒκ°ν–ˆλ‹€. 

이와 같은 λ°©λ²•μœΌλ‘œ κ΅¬ν˜„μ„ ν•œ ν›„ 각각의 μ‹€νŒ¨μœ¨λ“€μ„ μƒˆλ‘œμš΄ λ¦¬μŠ€νŠΈμ— ν•˜λ‚˜ν•˜λ‚˜ μ§‘μ–΄λ„£μ—ˆλ‹€

def solution(N, stages):
    People = len(stages)
    faillist = []
    for i in range(1, N + 1):
        faillist.append(stages.count(i) / People)
        if stages.count(i) / People > 0:
            People -= stages.count(i)

    print(faillist)


A = 5
B = [2, 1, 2, 6, 2, 4, 3, 3]
solution(A, B)

결괏값은 μ•„λž˜μ™€ 같이 각각의 μ‹€νŒ¨μœ¨μ΄ 잘 μ €μž₯된 것을 λ³Ό 수 μžˆλ‹€.

ν•˜μ§€λ§Œ 우린 결과값을 μ‹€νŒ¨μœ¨μ˜ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ λ°°μ—΄μ˜ 인덱슀λ₯Ό 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

λΆ„λͺ… for문을 ν•œ 번 더 λŒλ¦¬κ±°λ‚˜ ν•˜λ©΄ λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ‚  ν™•λ₯ μ΄ 높을 것 κ°™κ³ , 더 쒋은 방법이 μžˆμ„ κ²ƒλ§Œ 같은 생각에 계속 고민을 ν–ˆλ‹€.

그러던 쀑 아침에 λ‹€νŠΈ μ–Έμ–΄μ˜ 문법을 λ³΄λ©΄μ„œ κΈ°μ–΅λ‚œ map!! 

πŸ’‘ νŒŒμ΄μ¬μ—μ„œλŠ” 리슀트λ₯Ό λ”•μ…”λ„ˆλ¦¬λ‘œ λŒ€μ²΄ν•΄μ„œ μ΄μš©ν•˜λ©΄ ν’€ 수 μžˆμ„ 것 κ°™μ•˜λ‹€.!!

 

ν•˜μ§€λ§Œ λ¬Έμ œλŠ” λ”•μ…”λ„ˆλ¦¬ 값을 μ–΄λ–»κ²Œ μ „λ‹¬ν–ˆλŠ”μ§€ 기얡이 λ‚˜μ§€ μ•ŠλŠ”λ‹€ 🀦‍♂️

κ·Έλž˜μ„œ λ”•μ…”λ„ˆλ¦¬ λ„£λŠ” 법을 λ‹€μ‹œ ꡬ글링.. 

 

κ°„λ‹¨ν–ˆλ‹€. 리슀트 [] λŒ€μ‹  λ”•μ…”λ„ˆλ¦¬μΈ {}둜 선언을 ν•΄μ£Όκ³  'λ”•μ…”λ„ˆλ¦¬{인덱슀} = κ°’'으둜 λ„£μœΌλ©΄ 끝!

그리고 λžŒλ‹€μ‹μ„ μ΄μš©ν•˜μ—¬ return을 ν•΄μ£Όμ—ˆλ‹€.

πŸ’‘ μˆ˜μ • μ½”λ“œ

def solution(N, stages):
    People = len(stages)
    faillist = {}
    for i in range(1, N + 1):
        if People != 0:
            faillist[i] = stages.count(i) / People
            People -= stages.count(i)
        else:
            faillist[i] = 0

    return sorted(faillist, key=lambda i: faillist[i], reverse=True)

 

* λ”•μ…”λ„ˆλ¦¬ μžŠμ§€ 말자

* λžŒλ‹€μ‹ μžŠμ§€ 말자 

λ°˜μ‘ν˜•