반응형
프로그래머스 7주차 문제이다.
입실과 퇴실이 반복되는 방에서 어떤 경우에도 반드시 만날 수 밖에 없는 손님을 카운트 하는 문제였다.
어떤 경우에는 만나고, 어떤 경우에는 안만나는 상황은 알고리즘 적인 상황이 아니니 분명 무슨 경우의 수가 있을 것이라 가정하고 풀었다.
공책에 몇번 써가면서 내가 세운 규칙은
- 입실과 퇴실중 입실먼저 수행한다.
- 방이 비어있는데 입실과 퇴실이 같다면 아무도 만나지 않고 나간다.
- 퇴실[0]과 입실[last]가 다르다면 입실 먼저!
- 퇴실[0]와 입실[last]가 같다면 입실 수행후 퇴실 번호가 없을때까지 퇴실만 수행
- 입실이 비어있다면 반복을 종료!
로 세우고 문제를 풀었다.
손님들 끼리 만나는 경우 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
반응형
'algorithm > programmers' 카테고리의 다른 글
전력망을 둘로 나누기 [프로그래머스] (0) | 2021.10.09 |
---|---|
예상 대진표 [프로그래머스] (0) | 2021.09.23 |
복서 정렬하기 [프로그래머스] (0) | 2021.09.07 |
H-index [프로그래머스] (0) | 2021.07.06 |
소수 찾기 [프로그래머스] (0) | 2021.07.05 |
댓글