1. 오픈채팅방
문제 링크: https://programmers.co.kr/learn/courses/30/lessons/42888
접근했던 방법
record
에서 유저 아이디별로 닉네임 정보를 확인할 수 있기 때문에 record
를 읽으면서 Enter 혹은 Change를 확인할 경우 유저의 정보를 업데이트 하면 된다고 생각했습니다. 정보 저장은 dict
를 사용했습니다. 사소한 실수만 하지 않는 다면 간단한 문제입니다.
코드
1 |
|
- Leave 메세지는 신경 쓰지 않습니다.
record
의 원소를split
할 때state, userid, name = message.split(" ")
와 같이 명시하면Leave
일 경우 에러가 납니다.histotry
에 유저 아이디와 닉네임 업데이트 사항을 기록합니다.- 최종 업데이트 사항에 맞춰 해당되는 메세지를 출력합니다.
2. 실패율
문제 링크: https://programmers.co.kr/learn/courses/30/lessons/42889
접근했던 방법
2번 문제도 문제에서 요구하는 사항을 그대로 코드로 옮기면 되는 간단한 문제입니다. 다만 stages
에는 [1, N] 가 모두 포함되어 있지 않기 때문에 이 부분 (즉, 실패율이 0이 되는 부분)만 신경 쓰면 됩니다. 실패율을 구할 때는 해당 스테이지에 도달한 플레이어의 수를 구해야 하는데, 이는 해당 스테이지 이상에 해당하는 원소의 개수를 세면 됩니다. 다만 이 때 조건문으로 매번 원소의 개수를 구하는 건 비효율적이라 생각했고, 1번 문제와 마찬가지로 dict
를 사용했습니다.
코드
1 |
|
- 먼저
stages
를 순회하면서 각 스테이지별로 몇 명의 플레이어가 머물러 있는 지 세 줍니다. 이 때collection.defaultdict
를 사용하면 손쉽게 처리할 수 있습니다. - 다음으로는
range(1, N + 1)
을 순회하면서 실패율을 계산해주었습니다. 이 때 총 플레이어 수를 미리 구해 놓은 다음 (num_users
) 실패율을 구할 때마다 해당 스테이지에 머물러 있는 플레이어의 수는 빼 주었습니다. 이러면 다음 실패율을 구할 때는 해당 스테이지 이상에 도달한 플레이어의 수만 남게 됩니다.range(1, N + 1)
을 순회하면서n
이info
에 있으면 실패율을 구해주고 플레이어의 수를 차감합니다. 그렇지 않을 경우 실패율은 0으로 처리해줍니다. - 마지막으로 실패율
dict
를 내림차순으로 정렬해주고, 키만 해답으로 리턴합니다.