여름의 서재

[프로그래머스] 위클리 챌린지_7주차_입실퇴실 본문

알고리즘/프로그래머스

[프로그래머스] 위클리 챌린지_7주차_입실퇴실

엉아_ 2021. 9. 15. 00:26
728x90

📕 문제

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

오늘 회의실에는 총 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의 길이
    • 모든 사람의 번호가 중복없이 하나씩 들어있습니다.

[입출력 예]

enter leave result
[1,3,2] [1,2,3] [0,1,1]
[1,4,2,3] [2,1,3,4] [2,2,1,3]
[3,2,1] [2,1,3] [1,1,2]
[3,2,1] [1,3,2] [2,2,2]
[1,4,2,3] [2,1,4,3] [2,2,0,2]

 

💡 풀이법

1. 먼저 각각이 만난 사람의 수를 담을 answer 리스트를 만든다

2. 각각이 만난 사람의 번호를 담을 result 리스트를 만든다.

3. 퇴실한 사람의 리스트를 처음부터 돌면서 퇴실 한 사람이 입실했을 때 방에 있었던 사람의 번호를 lst에 담는다.

4. 그 때 있었던 사람들 각각의 해당 result에 lst를 넣어준다.

5. 퇴실한 사람은 이제 방에 더이상 없으니 enter에서 지워준다.

6. 이런식으로 for문을 다 돌고 나면 각각이 만난 사람의 번호들이 result에 담긴다.

7. 이제 result를 돌면서 만난 사람들의 수를 세서 answer에 넣어준다.

8. 하지만 중복도 있고 본인의 번호가 result에 들어가 있기 때문에 중복을 없애주기 위해 set을 하고, 자기자신의 번호를 지우기 위해 1을 빼준다.

 

def solution(enter, leave):
    answer = []
    result = [[] for _ in range(len(enter))]
    for i in leave:
        lst = enter[:enter.index(i)+1]
        for j in lst:
            result[j-1]+= lst
        enter.remove(i)

    for i in result:
        answer.append(len(set(i))-1)
    return answer
Comments