코딩테스트/프로그래머스

프로그래머스 위클리 챌린지 7주차 입실 퇴실 문제 해설/코드 (파이썬)

RyanKwon 2021. 9. 15. 20:30
728x90

문제 코드만 궁금한 분은

GitHub - Rhyankwon/algorithms

Contribute to Rhyankwon/algorithms development by creating an account on GitHub.

github.com

일단 문제 설명부터 ㄱㄱ

위클리 챌린지가 지금껏 그랬듯..(몇문제 풀었다고;ㅋㅋ) 엄청 어렵진 않다. 입실 순서, 퇴실 순서가 저장된 리스트가 입력되면 반드시 만날 수 밖에 없는 순번들이 생긴다. 그리고 나는 아래와 같은 논리로 풀었다.

1. While문을 사용해 입실 순서대로 한명씩 입실시키기.(Room변수 리스트 만들어서 안에 넣기)
2. 퇴실 순서의 맨 앞쪽부터, 만일 어떤 번호인 사람이 room안에 있으면 퇴실시키기.
3. 이 때 퇴실 한명 -> 입실한명 반복이 아니라, 뒤의 사람을 새로 입실시키기 전 퇴실 시킬 사람들은 순번에 따라 다 퇴실시킴(‘반드시’마주치는 경우만 체크해야하므로 빼내는게 우선)
4. 퇴실시에는 방에 남아있는 사람들에게 만난 수 1 추가
5. 퇴실 후 본인은 만난 수 (자기 제외하고 방에 남아있는 사람 수) 추가
6. 반복 후 퇴실인원 없으면 끝내기

4, 5번이 가장 중요한 부분인데 나도 이부분에서 살짝 헤맸다. 순번에 따라 사람을 내보내면서도 매번 최대인원에 맞게 숫자를 더해줘야 하는점이 조금 까다로웠다. <- 대충 쓴 문장이니까 이해하려고 안 해도 됨 ㅎㅎ..


그래서 간단히 내 논리를 얘기하면, 퇴실 가능한 인원을 한번에 퇴실을 싹 시킬건데, 총 6명이 나가야 하고 만일 어떤 사람p이 3번째로 나가야 한다면, 이 사람은 자기보다 먼저 나가는 사람 2 + 자기보다 늦게 나갈 사람3 이렇게 해서 총 5명을 반드시 마주치게 된다. 그러니까, 자기보다 먼저 나가는 사람의 경우 그 사람(번호)를 room에서 내보낼 때 p에 1을 더해주고(+1, +1) 그리고 p가 나갈 때 남아있는 사람 수를 더해주면(+3) 반드시 만나는 사람 5를 계산해낼 수 있다. 포인트는 하나의 번호인 사람이 나갈 때 남아있는 사람들에게 1을 더해주고 본인에는 남아있는 사람 수만큼을 더해주는거..랄까

무리 없이 잘 풀린당

728x90