[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/python] μœ„ν΄λ¦¬ μ±Œλ¦°μ§€ 7μ£Όμ°¨ : μž…μ‹€ 퇴싀

2021. 9. 15. 15:20

문제 μ„€λͺ…

μ‚¬νšŒμ  거리두기λ₯Ό μœ„ν•΄ νšŒμ˜μ‹€μ— μΆœμž…ν•  λ•Œ λͺ…뢀에 이름을 적어야 ν•©λ‹ˆλ‹€. μž…μ‹€κ³Ό 퇴싀이 λ™μ‹œμ— μ΄λ€„μ§€λŠ” κ²½μš°λŠ” μ—†μœΌλ©°, μž…μ‹€ μ‹œκ°κ³Ό 퇴싀 μ‹œκ°μ€ λ”°λ‘œ κΈ°λ‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

였늘 νšŒμ˜μ‹€μ—λŠ” 총 nλͺ…이 μž…μ‹€ ν›„ ν‡΄μ‹€ν–ˆμŠ΅λ‹ˆλ‹€. νŽΈμ˜μƒ μ‚¬λžŒλ“€μ€ 1λΆ€ν„° nκΉŒμ§€ λ²ˆν˜Έκ°€ ν•˜λ‚˜μ”© λΆ™μ–΄μžˆμœΌλ©°, 두 번 이상 νšŒμ˜μ‹€μ— λ“€μ–΄μ˜¨ μ‚¬λžŒμ€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λ•Œ, 각 μ‚¬λžŒλ³„λ‘œ λ°˜λ“œμ‹œ λ§Œλ‚œ μ‚¬λžŒμ€ λͺ‡ λͺ…인지 κ΅¬ν•˜λ € ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μž…μ‹€ λͺ…뢀에 기재된 μˆœμ„œκ°€ [1, 3, 2], 퇴싀 λͺ…뢀에 기재된 μˆœμ„œκ°€ [1, 2, 3]인 경우,

  • 1번과 2λ²ˆμ€ λ§Œλ‚¬λŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.
  • 1번과 3λ²ˆμ€ λ§Œλ‚¬λŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.
  • 2번과 3λ²ˆμ€ λ°˜λ“œμ‹œ λ§Œλ‚¬μŠ΅λ‹ˆλ‹€.

또 λ‹€λ₯Έ 예둜 μž…μ‹€ μˆœμ„œκ°€ [1, 4, 2, 3], 퇴싀 μˆœμ„œκ°€ [2, 1, 3, 4]인 경우,

  • 1번과 2λ²ˆμ€ λ°˜λ“œμ‹œ λ§Œλ‚¬μŠ΅λ‹ˆλ‹€.
  • 1번과 3λ²ˆμ€ λ§Œλ‚¬λŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.
  • 1번과 4λ²ˆμ€ λ°˜λ“œμ‹œ λ§Œλ‚¬μŠ΅λ‹ˆλ‹€.
  • 2번과 3λ²ˆμ€ λ§Œλ‚¬λŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.
  • 2번과 4λ²ˆμ€ λ°˜λ“œμ‹œ λ§Œλ‚¬μŠ΅λ‹ˆλ‹€.
  • 3번과 4λ²ˆμ€ λ°˜λ“œμ‹œ λ§Œλ‚¬μŠ΅λ‹ˆλ‹€.

νšŒμ˜μ‹€μ— μž…μ‹€ν•œ μˆœμ„œκ°€ λ‹΄κΈ΄ μ •μˆ˜ λ°°μ—΄ enter, ν‡΄μ‹€ν•œ μˆœμ„œκ°€ λ‹΄κΈ΄ μ •μˆ˜ λ°°μ—΄ leaveκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 각 μ‚¬λžŒλ³„λ‘œ λ°˜λ“œμ‹œ λ§Œλ‚œ μ‚¬λžŒμ€ λͺ‡ λͺ…인지 번호 μˆœμ„œλŒ€λ‘œ 배열에 λ‹΄μ•„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

 

μ œν•œμ‚¬ν•­

  • 1 ≤ enter의 길이 ≤ 1,000
  • 1 ≤ enter의 μ›μ†Œ ≤ enter의 길이
    • λͺ¨λ“  μ‚¬λžŒμ˜ λ²ˆν˜Έκ°€ 쀑볡없이 ν•˜λ‚˜μ”© λ“€μ–΄μžˆμŠ΅λ‹ˆλ‹€.
  • leave의 길이 = enter의 길이
  • 1 ≤ leave의 μ›μ†Œ ≤ leave의 길이
    • λͺ¨λ“  μ‚¬λžŒμ˜ λ²ˆν˜Έκ°€ 쀑볡없이 ν•˜λ‚˜μ”© λ“€μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

μ •λ‹΅

from collections import deque

def solution(enter, leave):
    answer = [0 for _ in range(len(enter)+1)]
    leave = deque(leave)
    
    room = []
    for i in enter:
        # μ›λž˜ 있던 μˆ«μžλž‘ λ§Œλ‚¨ ν‘œμ‹œ
        for r in room:
            answer[r] += 1
        answer[i] += len(room)
        room.append(i)

        while leave and leave[0] in room:
            room.remove(leave.popleft())
    
    return answer[1:]

answerμ—λŠ” 각 μΈλ±μŠ€κ°€ λͺ‡ λͺ…을 λ§Œλ‚¬λŠ”μ§€λ₯Ό ν‘œμ‹œν•΄μ€€λ‹€.

숫자 0은 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ len(enter)+1만큼 0으둜 μ΄ˆκΈ°ν™”ν•œλ‹€.

 

enter의 숫자λ₯Ό μ°¨λ‘€λŒ€λ‘œ room에 λ„£μ–΄μ€€λ‹€.

숫자 i λ₯Ό 넣을 λ•Œ room에 λˆ„κ΅°κ°€ μžˆλ‹€λ©΄

room에 μžˆλŠ” 숫자의 인덱슀λ₯Ό 가진 answer에 i와 λ§Œλ‚¬μŒμ„ ν‘œμ‹œν•˜κΈ° μœ„ν•΄ +1 ν•΄μ€€λ‹€.

answer[i]μ—λŠ” room에 μžˆλŠ” λͺ¨λ“  μˆ«μžμ™€ λ§Œλ‚¬μŒμ„ ν‘œμ‹œν•˜κΈ° μœ„ν•΄ +len(room)을 ν•΄μ€€λ‹€.

 

leave의 0번째 μΈλ±μŠ€κ°€ room에 μžˆλ‹€λ©΄ λ– λ‚˜μ•Ό ν•˜λ―€λ‘œ

leave의 0번째 인덱슀λ₯Ό popν•˜μ—¬ roomμ—μ„œ μ§€μ›Œμ€€λ‹€.

 

이 λ•Œ leaveλ₯Ό deque둜 λ³€ν™˜ν•˜μ—¬ popleftλ₯Ό 톡해 κΊΌλ‚΄λ©΄ 더 νš¨μœ¨μ μ΄λ‹€.

 

answer[0]은 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μŒμœΌλ‘œ answer[1:]을 return ν•œλ‹€.

728x90

BELATED ARTICLES

more