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

chanyeong kim·2021년 9월 26일
0

프로그래머스

목록 보기
7/51

📩 -->문제설명

오늘 회의실에는 총 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의 길이
    • 모든 사람의 번호가 중복없이 하나씩 들어있습니다.

입출력 예

enterleaveresult
[1,3,2][1,2,3][0,1,1]
[1,4,2,3][2,1,3,4][2,2,1,3]
[3,2,1][2,1,3][1,1,2]
[3,2,1][1,3,2][2,2,2]
[1,4,2,3][2,1,4,3][2,2,0,2]

💡 solution(사용언어: python)

def solution(enter, leave):
    answer = [0]*len(enter)
    answer.append(0)
    currentroom=[]
    
    while leave:
        if leave[0] in currentroom:
            out=leave.pop(0)
            currentroom.remove(out)
            answer[out]+=len(currentroom)
            
            for i in currentroom:
                answer[i]+=1
        else:
            currentroom.append(enter.pop(0))
    return answer[1:]
    

👉 설명

처음에는 경우의 수를 생각해서 for 구문을 통해 접근해 봤는데, 시간도 오래 걸리고 경우의 수를 완벽하게 생각한 것 같지 않아서, currentroom이라는 리스트를 만들어서 실제로 숫자(사람)들이 방을 출입할 때 만나는 숫자들을 카운트 해주는 방식으로 접근했다!

    answer = [0]*len(enter)
    answer.append(0)
  • 먼저 숫자들이 방을 출입하면서 만나는 숫자의 수를 카운트 해주는 리스트 answer를 만들어 주었다.
  • 1번부터 시작하려고 0하나를 더 추가해 주었다
    while leave:
        if leave[0] in currentroom:
            out=leave.pop(0)
            currentroom.remove(out)
            answer[out]+=len(currentroom)
            
            for i in currentroom:
                answer[i]+=1
        else:
            currentroom.append(enter.pop(0))
    return answer[1:]
  • 제일 처음 방을 나간 숫자가 currentroom에 포함되기 전까지 enter에서 입실한 순서대로 숫자들을 currentroom에 포함시켜준다.
	out=leave.pop(0)
    	
  • 제일 처음 방을 나간 숫자가 currentroom에 있다면 그 숫자를 out이라고 선언해준다
	
    	currentroom.remove(out)
        answer[out]+=len(currentroom)
  • 이후 out을 leave와 currentroom 에서 제거해주면, 이때 currentroom의 길이가 out이라는 숫자가 만난 숫자의 수를 의미한다
	for i in currentroom:
            answer[i]+=1
  • 그리고 out이 만난 숫자들 역시 out을 만났기 때문에 따로 for 구문을 이용해서 1씩 카운트를 해준다

결과

다른 풀이

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개의 댓글