본문 바로가기
algorithm/programmers

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

by hoonzii 2021. 9. 15.
반응형

프로그래머스 7주차 문제이다. 

입실과 퇴실이 반복되는 방에서 어떤 경우에도 반드시 만날 수 밖에 없는 손님을 카운트 하는 문제였다.

 

어떤 경우에는 만나고, 어떤 경우에는 안만나는 상황은 알고리즘 적인 상황이 아니니 분명 무슨 경우의 수가 있을 것이라 가정하고 풀었다.

공책에 몇번 써가면서 내가 세운 규칙은

  1. 입실과 퇴실중 입실먼저 수행한다.
  2. 방이 비어있는데 입실과 퇴실이 같다면 아무도 만나지 않고 나간다.
  3. 퇴실[0]과 입실[last]가 다르다면 입실 먼저!
  4. 퇴실[0]와 입실[last]가 같다면 입실 수행후 퇴실 번호가 없을때까지 퇴실만 수행
  5. 입실이 비어있다면 반복을 종료!

 

로 세우고 문제를 풀었다. 

손님들 끼리 만나는 경우 meet_matrix 라는 행렬을 만들어 "O"로 표시, 자기 자신은 만남의 카운트로 배제하기 위해 "X"로 표시 했다.

 

def solution(enter, leave):
    answer = []
    
    meet_matrix = []
    for i in range(len(enter)):
        meet_row = []
        for j in range(len(leave)):
            if i == j:
                meet_row.append("X")
            else:
                meet_row.append("")
        meet_matrix.append(meet_row) # 만남을 기록하는 행렬 생성
    
    room = []
    while True:
        if len(room) == 0 and enter[0] == leave[0]:
            enter.pop(0)
            leave.pop(0)  #방이 비어있는데 입실 퇴실이 같은 번호 = 입실하자마자 퇴실각
        else: # 방이 비어있지 않다면 만난다!
            enter_num = enter.pop(0)
            room.append(enter_num)
            for i in room: # 만남을 O로 표시해 기록
                if i != enter_num:
                    meet_matrix[enter_num-1][i-1] = "O"
                    meet_matrix[i-1][enter_num-1] = "O"
            while len(leave) != 0: # 퇴실할때 방안에 있는 사람들 다 나갈때까지 기다리기
                if leave[0] in room:
                    room.remove(leave[0])
                    leave.pop(0)
                else:
                    break
        if len(enter) == 0:
            break

    for meet_row in meet_matrix:
        count = 0
        for meet in meet_row:
            if meet == "O":
                count+=1
        answer.append(count)
    
    return answer

 

문제 링크는 요기

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

 

코딩테스트 연습 - 7주차

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

programmers.co.kr

 

반응형

댓글