프로그래머스 입실 퇴실 코드 및 해설 (파이썬)

2021. 9. 14. 14:53algorithm

반응형

https://programmers.co.kr/learn/courses/30/lessons/86048?language=python3 

 

코딩테스트 연습 - 7주차

사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다. 오늘 회의실에는

programmers.co.kr

 

테스트 케이스 26, 27번에서 시간 초과 뜨는데 모르겠다 ㅎ

leave를 큐로 만들어서 leave의 모든 요소가 사라질 때까지 다음을 반복한다. 현재 회의실에 leave의 첫번째 요소가 있으면 바로 제거, 그렇지 않으면 그 사람이 들어올 때까지 enter의 첫 요소를 pop해서 회의실 안에 들여놓는다. 이렇게 회의실 인원에 변화가 있을 때마다 만난 사람이 있으면 딕셔너리에 저장해준다. 이 부분에서 for문 2개를 써서 시간 초과인 듯;; 

from collections import deque, defaultdict

def solution(enter, leave):
    room = [] # 빈 회의실로 초기화 
    N = len(enter) # 입실후 퇴실한 사람들의 총 인원 
    # key가 만난 사람들의 집합을 value로 갖는 딕셔너리 
    roommates = defaultdict(set) 
    enter = deque(enter)
    leave = deque(leave)
    while leave:
        # 퇴실할 사람 
        cur = leave.popleft()
        # 퇴실할 사람이 지금 회의실에 없으면, 그 사람이 들어올 때까지 enter에서 pop
        while enter and cur not in room:
            room.append(enter.popleft())
        # 현재 회의실에 2명이상 있는 경우
        if len(room) > 1:
            # 만난 사람 목록 저장 
            for a in room:
                for b in room:
                    if a < b:
                        roommates[a].add(b)
                        roommates[b].add(a)
        # 퇴실 시킴 
        room.remove(cur)
    
    # 1-N까지 총 만난 사람의 인원수 
    return [len(roommates[n]) for n in range(1, N+1)]
반응형