[2019 KAKAO BLIND RECRUITMENT] 오픈채팅방(42888)
def solution(record):
answer = []
users = {}
enter_list = []
for r in record :
if r.split(' ')[0] == "Enter" :
users[r.split(' ')[1]] = r.split(' ')[2]
enter_list.append([r.split(' ')[1], r.split(' ')[0]])
elif r.split(' ')[0] == "Leave" :
enter_list.append([r.split(' ')[1], r.split(' ')[0]])
else :
users[r.split(' ')[1]] = r.split(' ')[2]
for i in enter_list :
if i[1] == "Enter" :
answer.append("{0}님이 들어왔습니다.".format(users[i[0]]))
else :
answer.append("{0}님이 나갔습니다.".format(users[i[0]]))
return answer
def main() :
record = ["Enter uid1234 Muzi",
"Enter uid4567 Prodo",
"Leave uid1234",
"Enter uid1234 Prodo",
"Change uid4567 Ryan"]
print(solution(record))
if __name__ == "__main__" :
main()
* 고려해야 하는 것은?
1. 순서 : 입장하거나 퇴장한 순서대로 메시지를 출력해야 하기 때문
2. 유저 아이디 : 닉네임 변경시 사용자를 구분하는 구분자이기 때문
3. 닉네임 : 출력시 사용해야 하기 때문
4. Enter / Leave : 출력시 사용해야 하기 때문
* 변수 설명 :
- answer : 최종적으로 출력할 문자열들을 저장하는 배열. [" ~ ", " ~ ", ...] 형태.
- users : 유저 아이디를 키로 하여 닉네임을 저장하는 딕셔너리. [{유저 아이디 : 닉네임}, {유저 아이디 : 닉네임}, ... ] 형태.
- enter_list : 유저들이 순서대로 Enter/Leave를 한 기록을 저장하는 배열. [[유저 아이디, Enter/Leave], [유저 아이디, Enter/Leave], ...] 형태
* 로직 설명
- record를 공백을 기준으로 나누었을 때 첫번째 문자열이 Enter(r.split(' ')[0])이면 user 딕셔너리에 유저 아이디(r.split(' ')[1])를 key로 하여 닉네임(r.split(' ')[2])을 저장, enter_list 배열에 유저 아이디(r.split(' ')[1])와 Enter/Leaver.split(' ')[0]]) 저장
- record를 공백을 기준으로 나누었을 때 첫번째 문자열이 Leave(r.split(' ')[0])이면 enter_list 배열에 유저 아이디(r.split(' ')[1])와 Enter/Leaver.split(' ')[0]]) 저장
- 그 외에는 Change 이기 때문에 user 딕셔너리에 유저 아이디(r.split(' ')[1])를 key로 하여 닉네임(r.split(' ')[2])을 저장하여 변경
- 그 다음에는 enter_list의 원소를 하나씩 돌면서(i) 원소의 1번째 원소(i[1])가 Enter이면 user딕셔너리를 유저 아이디로 접근users[i[0]]하여 닉네임+님이 들어왔습니다를 answer에 append.
- Enter가 아닐 경우 user딕셔너리를 유저 아이디로 접근users[i[0]]하여 닉네임+님이 나갔습니다를 answer에 append.
- answer 반환
* 한줄평
나이브하게 풀어서 쉽게 풀었당~^^;
요정~도까지는 할만함a