곰퓨타의 SW 이야기

[프로그래머스 level2 7주차_입실 퇴실] 규칙 찾기 본문

TIL/프로그래머스

[프로그래머스 level2 7주차_입실 퇴실] 규칙 찾기

곰퓨타 2021. 9. 30. 01:47

해결해야하는 문제는 다음과 같았다.

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

 

코딩테스트 연습 - 7주차_입실 퇴실

사회적 거리두기를 위해 회의실에 출입할 때 명부에 이름을 적어야 합니다. 입실과 퇴실이 동시에 이뤄지는 경우는 없으며, 입실 시각과 퇴실 시각은 따로 기록하지 않습니다. 오늘 회의실에는

programmers.co.kr

 

어제 2단계를 풀며 애먹었던 경험으로 인해,, 남은 2단계 문제들을 풀어보고 넘어가고자 한다 !! 이 문제 또한 ,, 더럽게 해결한 것 같다..!

아이디어는 다음과 같다.

 

아이디어를 바탕으로 작성한 코드는 다음과 같다.

def solution(enter, leave):
    answer = []
    enter_time = {}
    leave_time ={}
    n=len(enter)

    for i in range(n):
        enter_time[enter[i]] = i
        leave_time[leave[i]] = i


    meeting_person = [set() for _ in range(n+1)]
    for i in range(1,n+1):
        i_enter = enter_time[i]
        i_leave = leave_time[i]
        for j in range(1,n+1) :
            if i != j and j not in meeting_person[i]:
                if enter_time[j] < i_enter and leave_time[j] > i_leave :
                    for k in range(enter_time[j]+1,i_enter + 1):
                        meeting_person[enter[k]].add(j)
                        meeting_person[j].add(enter[k])
                elif enter_time[j] > i_enter and leave_time[j] < i_leave :
                    for k in range(i_enter+1,enter_time[j]+1):
                        meeting_person[i].add(enter[k])
                        meeting_person[enter[k]].add(i)


    for i in range(1,n+1):
        answer.append(len(meeting_person[i]))

    return answer

 

 

너무 더럽게 푼 것 같아서 다른 사람의 풀이를 참고하며 주석을 달며 이해해보았다.

def solution(enter,leave):
    answer = [0] * len(enter)

    room = []
    enter_idx = 0
    # 떠나는 멤버 기준으로 시작 !
    for l in leave:
        # 현재 떠나는 멤버가 도착할 때까지 room에 인원수를 추가해준다.
        while l not in room :
            room.append(enter[enter_idx])
            enter_idx+=1
        # 현재 떠나는 멤버를 떠나보낸다.
        room.remove(l)
        # 떠나는 멤버는 현재 룸에 존재하여 만나는 인원수를 기록한다.
        answer[l-1] += len(room)

        # room에 있는 인원들은 현재 떠나는 멤버와 있었다는 의미로 1 더해준다.
        for person in room :
            answer[person-1] += 1

    return answer

 

 

현재 떠나는 멤버를 기준으로 room이라는 공간을 생성하여 그 공간에 있는 사람들은 만나는 것이므로, 이를 체크해주는 방식이다. 규칙을 찾아 회의실을 만들어 문제를 풀이하였다는 점이 흥미로웠다...

오늘 문제를 너무 더럽게 풀었는데,, 다음에 비슷한 유형의 문제를 마주한다면 좀 더 깔끔하게 해결해보고 싶다 !

Comments