알고리즘/프로그래머스

[위클리 챌린지] 7주차

래울 2021. 9. 17. 20:43

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

 

코딩테스트 연습 - 7주차

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

programmers.co.kr

 

- 풀이

 

1. 현재 입실한 인원이 누구인지를 담는 now_in리스트와 

Key가 번호, Value가 각 번호와 만났는지를 체크하는 리스트인 meet딕셔너리를 사용한다.

 

2. meet딕셔너리를 {번호, [0, 0, 0, ... ,0]} 의 형태로 초기화한다.

 

3. 만약 enter = [1, 3, 2] 이고, leave = [1, 2, 3] 일 경우... meet딕셔너리는 아래와 같다.

 

  - 초기상태

Key Value
1 [0, 0, 0]
2 [0, 0, 0]
3 [0, 0, 0]

 

  - now_in=[1]

Key Value
1 [1, 0, 0]
2 [0, 0, 0]
3 [0, 0, 0]

 

  - now_in=[]

Key Value
1 [1, 0, 0]
2 [0, 0, 0]
3 [0, 0, 0]

 

  - now_in=[3]

Key Value
1 [1, 0, 0]
2 [0, 0, 0]
3 [0, 0, 1]

 

  - now_in=[3, 2]

Key Value
1 [1, 0, 0]
2 [0, 1, 1]
3 [0, 1, 1]

 

4. 누군가 입실할 때, 본인과 현재 입실해 있는 인원들의 리스트를 check한다.

5. 나 자신을 제외하고 check개수를 세서 반환한다.

 

 

 

- 코드

def solution(enter, leave):
    answer, now_in = [], []
    meet = {}
    for i in range(len(enter)):
        meet[i+1] = [0 for k in range(len(enter))]
    for i in enter:
        while leave:
            if leave[0] in now_in: 
                now_in.remove(leave.pop(0))
            else: 
                break
        now_in.append(i)
        for n in now_in:
            meet[n][i-1] = meet[i][n-1] = 1
    return [sum(meet[i])-1 for i in meet]