Posts 7Week 입실 퇴실 [Python]
Post
Cancel

7Week 입실 퇴실 [Python]

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

문제 설명

  • 사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다.
  • 오늘 회의실에는 총 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의 key를 가지는 dict를 생성
  • 출입을 확인할 room이라는 빈 리스트를 생성
  • 떠난 사람 목록을 for문을 돌면서 들어온 사람을 room리스트에 넣는다.
  • 이후 떠난 사람이 room에 들어오면 room에서 사람을 내보낸뒤(remove), answer의 key값에 +1을 해준다
  • 마지막으로 떠난 사람도 남아있는 모든 사람과 만난것이므로, room에 남아있는 사람만큼 값을 더해준다.
  • dict 형태로 되어있기 때문에 sorted를 활용해서 번호 순으로 정렬하며, 해당 번호의 사람이 만난 사람수를 result로 출력해준다.
  • 사실 answer를 dict로 생각해서 마지막에 sorted를 하는데, 이것보다 answer를 그냥 list로 만들고, 해당 인원순서를 idx로 하는 방식이 더 나을것 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def solution(enter, leave):
    answer = dict.fromkeys(enter,0)
    room = []
    enter_idx = 0


    for l in leave:

        while l not in room:
            room.append(enter[enter_idx])
            enter_idx += 1

        room.remove(l)
        for p in room:
            answer[p] +=1
        answer[l] += len(room)

    temp = sorted(answer.items(), key= lambda items : items[0])
    results = list(map(lambda x : x[1], temp))
    return results
1
2
3
enter = [1, 3, 2]
leave = [1, 2, 3]
solution(enter, leave)
1
[0, 1, 1]
1
2
3
enter = [1, 4, 2, 3]
leave = [2, 1, 3, 4]
solution(enter, leave)
1
[2, 2, 1, 3]
1
2
3
enter = [3, 2, 1]
leave = [2, 1, 3]
solution(enter, leave)
1
[1, 1, 2]
1
2
3
enter = [3, 2, 1]
leave = [1, 3, 2]
solution(enter, leave)
1
[2, 2, 2]
1
2
3
enter = [1, 4, 2, 3]
leave = [2, 1, 4, 3]
solution(enter, leave)
1
[2, 2, 0, 2]
This post is licensed under CC BY 4.0 by the author.