본문 바로가기

코딩테스트/Python

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

내 코드

def solution(enter, leave):
    answer = [0]*len(enter)
    s = []
    
    cnt1=cnt2=0
    
    while True:
        if cnt2>=len(leave)-1: break
        if cnt1<=len(enter):
            s.append(enter[cnt1])
            for i in s:
                if i==s[-1]:
                    answer[i-1] = len(s)-1
                else:
                    answer[i-1]+=1
        while True:
            if cnt2>=len(leave)-1: break
            if leave[cnt2] in s:
                s.remove(leave[cnt2])
                cnt2+=1
            else:
                break
        cnt1+=1
        
        
    return answer

으 ㅠ 문제 이해가 어려움!! 그래도 풀었다. 

s 라는 스택에 사람들의 입퇴실여부를 담았다. 만약 입실하였으면 s에 삽입하고 퇴실하였으면 s에서 제거한다.

cnt1과 cnt2는 문제에서 주어진 enter, leave를 제어하는 변수이다. pop을 해서 풀면 필요없지만 실행시간을 줄이기위해 변수로 접근하였다.

만약 cnt1이 enter에 접근할 수 있으면 s에 넣어준다. s에 들어가있는 사람끼리는 반드시 만났기 때문에 answer을 더해줄것이다. 이때 가장 마지막에 들어온사람은(s[-1]) 자기자신을 빼고 만났으므로 길이에서 1을 뺀 숫자를 answer에 더해준다. 원래 존재하던 사람은 append된 사람 한명만 더 만난것이기 때문에 +1을 해준다.

이렇게 한명이 들어왔으면 leave를 체크해서 나간사람을 확인해야한다. leave는 cnt2로 접근하였다.

s안에 leave[cnt2]가 없을 때까지 사람들을 제거해준다.

이렇게 더이상 퇴실할 사람이 존재하지 않을 때까지 while문을 돌려준다. 

 

 

다른사람 코드

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

while문말고 for문을 사용하였다. room에 퇴실한 사람이 존재하지 않을때 동안 room에 한사람씩 입실시켜준다.

그리고 l을 퇴실시켜준다.

room 리스트에 남아있는 사람들을 1씩 더해주고 퇴실한 l은 room의 길이만큼 더해준다.