[프로그래머스] LEVEL2 오픈채팅방 (Python)

[프로그래머스] LEVEL2 오픈채팅방


🧐 문제 설명

😍 나의 풀이

문제를 보자마자 문자열이 [행동][ID][닉네임]으로 되어있으니 각각에 쉽게 접근하기 위해서 분해해서 리스트로 저장하여 인덱스접근을 하기로 했다. uid가 결국 식별할 수 있는 키가 될 것이기 때문에 'uid'를 키 값으로 하여 값에 '닉네임'을 할당하는 딕셔너리를 생성하기로 했다. 그런데, 처음 시도할 때는 문제를 꼼꼼히 읽지 않고 바로 접근해서 문제가 발생했다.

if Enter:
     if uid 값이 기존에 없으면:
     	 uid 값에 추가

예를 들자면, 위에 의사코드에서처럼, nested if가 사용되어 가독성이 떨어지고 논리도 꼬이게 되었다. 하지만, uid가 바뀔 수 있는 상황은 단 2가지 뿐이었다.

  1. Enter
    → 이 경우는 '새롭게 들어오는 경우', '나갔다가 들어오면서 닉네임 바뀌는 경우' 이렇게 두 가지인데 이 두 가지는 결국 uid 키 값은 바뀌지 않으므로 다시 할당만 해주면 되기 때문에 구분할 필요가 없는 같은 case였다.

  2. 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와 같은 반복문, 제어문을 코드로 옮기기보다 문제를 꼼꼼히 읽어보고 머릿속으로 가지치기를 해서 구조화한 후에 코딩을 하는 게 중요할 것 같다.

좋은 웹페이지 즐겨찾기