[프로그래머스] LEVEL2 오픈채팅방 (Python)
🧐 문제 설명
😍 나의 풀이
문제를 보자마자 문자열이 [행동][ID][닉네임]으로 되어있으니 각각에 쉽게 접근하기 위해서 분해해서 리스트로 저장하여 인덱스접근을 하기로 했다. uid가 결국 식별할 수 있는 키가 될 것이기 때문에 'uid'를 키 값으로 하여 값에 '닉네임'을 할당하는 딕셔너리를 생성하기로 했다. 그런데, 처음 시도할 때는 문제를 꼼꼼히 읽지 않고 바로 접근해서 문제가 발생했다.
if Enter:
if uid 값이 기존에 없으면:
uid 값에 추가
예를 들자면, 위에 의사코드에서처럼, nested if가 사용되어 가독성이 떨어지고 논리도 꼬이게 되었다. 하지만, uid가 바뀔 수 있는 상황은 단 2가지 뿐이었다.
-
Enter
→ 이 경우는 '새롭게 들어오는 경우', '나갔다가 들어오면서 닉네임 바뀌는 경우' 이렇게 두 가지인데 이 두 가지는 결국 uid 키 값은 바뀌지 않으므로 다시 할당만 해주면 되기 때문에 구분할 필요가 없는 같은 case였다. -
Change
→ 마찬가지로 Change도 '이미 들어와있는' (나간 애는 닉네임을 이렇게 바꿀 수 없다.) user의 닉네임만 바꾸는 것이기 때문에 user의 키 값이 이미 존재하는지 여부를 확인할 필요가 없었다.
따라서 전체적인 풀이 과정은
입력 받는 문자열을 구분하여 리스트화 → uid 딕셔너리 키-값 할당 → 갱신된 uid 딕셔너리를 이용해 들어오고 나오는 것 출력
으로 구분할 수 있다. 각각 print()해보면서 인덱스에 쉽게 접근할 수 있었다.
def solution(record):
answer = []
stack = []
user = {}
for rec in record: #문자열 끊어서 리스트화
stack.append(rec.split(' '))
for i in stack: #uid를 키로 하는 user 딕셔너리 값 할당
if i[0] == 'Enter':
user[i[1]] = i[2]
elif i[0] == 'Change':
user[i[1]] = i[2]
for i in stack: #최신화된 user 딕셔너리를 출력
if i[0] == 'Enter':
answer.append(user[i[1]]+"님이 들어왔습니다.")
elif i[0] == 'Leave':
answer.append(user[i[1]]+"님이 나갔습니다.")
return answer
👏 다른 사람의 풀이
def solution(record):
answer = []
namespace = {}
printer = {'Enter':'님이 들어왔습니다.', 'Leave':'님이 나갔습니다.'}
for r in record:
rr = r.split(' ')
if rr[0] in ['Enter', 'Change']:
namespace[rr[1]] = rr[2]
for r in record:
if r.split(' ')[0] != 'Change':
answer.append(namespace[r.split(' ')[1]] + printer[r.split(' ')[0]])
return answer
내거랑 풀이가 매우 비슷했는데 특이한 것은 딕셔너리의 키 값을 uid로 하지 않고 'Enter', 'Leave'로 했다는 점이다. 그리고 나는 문자열을 리스트로 바꾸어서 저장을 해놓고 다시 반복문을 돌려서 uid 딕셔너리를 생성했지만, 이 분은 문자열을 리스트로 바꿈과 동시에 바로 딕셔너리에 키-값을 할당했다. 그래서 좀 더 코드가 간결해보인다. 가독성은 그래도 내가 더 좋은 것 같다ㅋㅋㅠㅠ🤥
🥇 Today I Learn
TIL.. 스킬은 특별한 게 없지만 무작정 for, if-else와 같은 반복문, 제어문을 코드로 옮기기보다 문제를 꼼꼼히 읽어보고 머릿속으로 가지치기를 해서 구조화한 후에 코딩을 하는 게 중요할 것 같다.
Author And Source
이 문제에 관하여([프로그래머스] LEVEL2 오픈채팅방 (Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sem/프로그래머스-LEVEL2-오픈채팅방Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)