택시짱의 개발 노트

[프로그래머스] 7주차 본문

알고리즘

[프로그래머스] 7주차

택시짱 2021. 9. 20. 00:14

링크

https://programmers.co.kr/learn/courses/30/lessons/86048

 

코딩테스트 연습 - 7주차

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

programmers.co.kr

 

풀이

loom이라는 딕셔너리에 입장한 사람을 모두 넣어 준 후

leaves에서 나가려고 하는 사람이 방에 있을 경우

현재 loom에 있는 사람들에게 내가 나간다~ 라는 정보를 알려 주고 나가는 사람 또한 방에 있는 사람의 정보를 가지고 옵니다. (아래의 코드)

user_contact[leaves[leave_pointer]].add(key)
user_contact[key].add(leaves[leave_pointer])

 

그리구 각 사용자의 user_contact에 저장된 갯수를 확인 하면 됩니다.

 

 

코드

from collections import defaultdict, deque


def solution(enters, leaves):
    loom, user_contact = defaultdict(bool), defaultdict(set)
    leave_pointer = 0
    for enter in enters:
        loom[enter] = True

        while loom[leaves[leave_pointer]]:
            for key, value in loom.items():
                if loom[key] and (key != leaves[leave_pointer]):
                    user_contact[leaves[leave_pointer]].add(key)
                    user_contact[key].add(leaves[leave_pointer])
            loom[leaves[leave_pointer]] = False
            leave_pointer += 1
            if leave_pointer >= len(leaves):
                leave_pointer -= 1

    return [len(user_contact[user_id]) for user_id in range(1, len(enters) + 1)]


if __name__ == '__main__':
    # enters, leaves = [1, 3, 2], [1, 2, 3]
    # enters, leaves = [1, 4, 2, 3], [2, 1, 3, 4]
    # enters, leaves = [3, 2, 1], [2, 1, 3]
    # enters, leaves= [3, 2, 1], [1, 3, 2]
    enters, leaves = [1, 4, 2, 3], [2, 1, 4, 3]

    print(solution(enters, leaves))

반응형
Comments