-
파이썬 알고리즘 - 오픈 채팅방일반 프로그래밍/알고리즘 2022. 5. 19. 18:23
문제 : https://programmers.co.kr/learn/courses/30/lessons/42888
코딩테스트 연습 - 오픈채팅방
오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오
programmers.co.kr
나의 풀이
def solution(record): answer = [] action = [] user = {} for i in record: #구분로직1 try : command = i.split()[0] uid = i.split()[1] name = i.split()[2] action.append(command) action.append(uid) user[uid] = name except IndexError: command = i.split()[0] uid = i.split()[1] action.append(command) action.append(uid) #구분로직2 if len(i.split()) == 2: command = i.split()[0] uid = i.split()[1] action.append(command) action.append(uid) else : command = i.split()[0] uid = i.split()[1] name = i.split()[2] action.append(command) action.append(uid) user[uid] = name for i in range(len(action)): if action[i] == 'Enter': answer.append(f"{user[action[i+1]]}님이 들어왔습니다.") elif action[i] == 'Leave': answer.append(f"{user[action[i+1]]}님이 나갔습니다.") i += 2 return answer
유저가 무슨 행동을 했는지를 담는 리스트인 action과, 유저의 최종 닉네임을 담은 딕셔너리 user를 선언하여 활용하였다.
record의 요소를 for문을 이용해 split하여 action과 user에 담았는데, Enter와 Change로 시작하는 문자열은 공백 split을 하면 3개로 쪼갤 수 있지만, Leave는 그렇지 않다. 즉 Leave로 시작하는 문장을 i.split()[2]를 하면 오류가 발생하고, 이를 눈치 채지 못하여 문제를 다 풀고도 왜 오류가 나는지를 찾지 못했다.
이러한 오류상황에서 착안하여 (사실 두번째 구분 로직이 생각나지 않았다) i.split()[2]를 하면 발생하는 오류인 Index out of range를 try문을 사용해 캐치하고 elif처럼 사용하였다.
위와 같은 과정을 통과하면 action의 짝수번째 인덱스에는 행동이 들어가고, 홀수번째 인덱스에는 uid가 들어간다. 그리고 딕셔너리에는 키값으로 uid, 밸류로 유저의 최종 닉네임이 들어가게 된다.
앞서 저장한 데이터를 통해 두번째 for문에서 answer 리스트에 문장을 삽입하게 되는데, action이 Enter면 "{유저이름}이 들어왔습니다" 라는 문자열이, Leave면 "{유저이름}이 나갔습니다." 라는 문자열이 추가되고, 이를 리턴하여 문제를 통과하였다.
두번째 구분로직은 split을 하면 나오는 리스트의 길이를 측정하여 Enter,Change와 Leave를 구분하였다.
'일반 프로그래밍 > 알고리즘' 카테고리의 다른 글
선택 정렬 파이썬으로 구현하기 (0) 2022.05.15 파이썬 알고리즘 - 연속된 값의 가장 큰 합, 이진 탐색 (0) 2022.05.08 파이썬 알고리즘 - 주식 가격, 같은 알파벳 묶기 (0) 2022.05.08 파이썬 알고리즘 - 재귀, binary gap (0) 2022.05.08 파이썬 알고리즘 - 합이 가장 적은경로 찾기, 0 배열끝으로 이동시키기 (0) 2022.05.01