[프로그래머스] 위클리 챌린지 7주차(Python)

알고리즘 저장소·2021년 9월 13일
0

프로그래머스

목록 보기
25/29

1.아이디어

문제에서 입실과 퇴실이 동시에 이뤄지는 경우가 없다는 사실을 이용하자. 핵심은 현재 회의실에 있는 사람들을 leave의 순서에 맞게 퇴실 시킬 수 있다면, 그 순서만큼 퇴실시키고 그 다음에 입실을 진행하면 된다. 입출력 2번째 예제를 토대로 설명하면 아래와 같다.

현재 회의실에 있는 사람들을 리스트(arr)에 넣어보자. 처음에는 1이왔다. 따라서 arr=[1]이다. 이후, leave에서 누가 먼저 떠나는 지 확인한다. 2가 먼저 떠나지만, 현재 회의실에 있는 사람은 1밖에 없으므로, 회의실에 나가는 사람은 없다.

4가 회의실에 두번째로 들어왔다. arr=[1,4]이다. 따라서 14가 만난다. 이후, leave에서 누가 먼저 떠나는지 확인해보자. 2가 먼저 떠나지만, 현재 2는 회의실에 없다. 따라서 회의실에 나가는 사람은 없다.

2가 회의실에 세번째로 들어왔다. arr=[1,4,2]이다. 따라서 142를 만난다. 이후, leave에서 누가 먼저 떠나는지 확인해보자. 2가 먼저 떠나므로 2는 회의실에서 나간다. 그 다음 leave에서 누가 떠나는지 확인해보자. 1이 떠나므로 1은 회의실에서 나간다. 그 다음 누가 떠나는지 확인하면 3인데 3은 회의실에 없다. 결과적으로 회의실에 있는 사람은 4밖에 없다.(arr=[4])

3이 회의실에 들어온다. arr=[4,3]이다 따라서 3,4는 서로 만난다. 이후, leave에서 누가 먼저 떠나는지 확인해보자. 3이 떠나므로, 3은 회의실에서 나간다. 그 다음 leave에서 누가 먼저 떠나는지 확인해보자. 4가 떠나므로, 4는 회의실에서 나간다. 모든 사람이 떠났다.

위의 과정을 진행하면서, 각 사람들이 몇 명을 만났는지 세면된다.

다시말해, 현재 회의실에 있는 사람들을 leave의 순서에 맞춰서 보낼 수 있으면 그 순서만큼 먼저 보내고 입실을 받는 것이다. 코드가 간결한편이 아니므로, 다른 사람들이 푼 풀이를 참고하는 것을 권장한다.

2.코드

def solution(enter, leave):
    arr = []    
    n = len(enter)
    answer = [0] * n
    i, j, = [0] * 2
    
    while True:
        if j == n: break
        while arr and j < n:
            try:
                x = arr.index(leave[j])
                del arr[x]
                j += 1
            except:
                break

        if i < n:
            arr.append(enter[i])
            i += 1
        
        if len(arr) > 1:
            for p in arr: answer[p-1] += 1 if answer[p-1] > 0 else len(arr) - 1
            
    return answer

0개의 댓글