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리스트를 돌다가 leave를 만나면 현재까지의 리스트에 존재하는 값들은 꼭 만나는 사람이므로 개수를 구해 각 숫자에 더해준다. 이미 leave값이 enter값에 존재하면 해당 값을 삭제한 후 반복한다.
- answer을 enter개수만큼 만들어둔다.
- cur_list를 만들고, leave 리스트의 인덱스인 j를 0으로 설정한다.
- enter의 처음 요소를 cur_list에 추가한다.
- 방금 들어온 값과 leave[j]의 값이 같으면 j를 하나 증가시킨 후, cur_list에 남아있는 개수를 해당 숫자 answer에 추가하고 해당 요소를 삭제한다.
- while문을 이용해서 leave[j]가 cur_list에 있으면 삭제한다.
이미 해당 요소의 갯수는 위 과정에서 처리했으므로 삭제만 하면 된다.
def solution(enter, leave): answer = [0 for i in range(len(enter))] cur_list = [] j = 0 for i in range(len(enter)): cur_list.append(enter[i]) if enter[i] == leave[j]: j += 1 for k in range(len(cur_list)): answer[cur_list[k] - 1] += len(cur_list) - 1 del cur_list[cur_list.index(enter[i])] while len(leave) > j and leave[j] in cur_list: del cur_list[cur_list.index(leave[j])] j += 1 return answer
- leave[l]이 room에 없으면 계속해서 추가하고, room에 있으면 해당 요소를 삭제한다.
- room에 있는 요소들을 answer에 하나씩 추가한다.
- 삭제된 l은 room의 개수만큼 answer에 추가해준다.
def solution(enter, leave): answer = [0] * len(enter) room = [] e_idx = 0 for l in leave: while l not in room: room.append(enter[e_idx]) e_idx += 1 room.remove(l) for p in room: answer[p - 1] += 1 answer[l - 1] += len(room) return answer