[프로그래머스] 입실 퇴실 Python

현지·2021년 9월 16일
0

프로그래머스

목록 보기
12/34

문제

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값에 존재하면 해당 값을 삭제한 후 반복한다.

  1. answer을 enter개수만큼 만들어둔다.
  2. cur_list를 만들고, leave 리스트의 인덱스인 j를 0으로 설정한다.
  3. enter의 처음 요소를 cur_list에 추가한다.
  4. 방금 들어온 값과 leave[j]의 값이 같으면 j를 하나 증가시킨 후, cur_list에 남아있는 개수를 해당 숫자 answer에 추가하고 해당 요소를 삭제한다.
  5. while문을 이용해서 leave[j]가 cur_list에 있으면 삭제한다.
    이미 해당 요소의 갯수는 위 과정에서 처리했으므로 삭제만 하면 된다.

[#Error]solution함수_python

::테스트 케이스는 모두 통과했지만, 틀린 이유를 아직 발견하지 못했다.

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

[#Clone]solution함수_python

  1. leave[l]이 room에 없으면 계속해서 추가하고, room에 있으면 해당 요소를 삭제한다.
  2. room에 있는 요소들을 answer에 하나씩 추가한다.
  3. 삭제된 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

0개의 댓글