티스토리 뷰

https://school.programmers.co.kr/learn/courses/30/lessons/42888

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1. 접근 방식

  • 닉네임은 변경될 수 있으므로, 불변하는 아이디로 출력 메시지를 완성한 이후에 아이디를 닉네임으로 교체하자.

따라서 코드는 크게 (1) 아이디로 메시지를 생성하는 부분과 (2) 메시지 내 아이디를 닉네임으로 교체하는 부분으로 나뉜다. (2) 과정에서 아이디에 해당하는 닉네임을 찾을 수 있도록 key가 아이디이고, value가 닉네임인 users 딕셔너리를 생성할 필요가 있다. users는 (1) 과정에서 Enter거나 Change일 때 users[아이디] = 닉네임 코드를 실행하여 생성할 수 있다. (1) 과정 동안 닉네임이 여러 번 변경되다가, (1) 과정이 끝나고나면 users에는 각 아이디의 최종 닉네임이 저장된다.

 

 

2. 정답 코드

def solution(record):
    #make_histories_with_uid
    messages = []
    users = dict()
    for r in record:
        r = r.split() # 0: Enter/Change/Leave, 1: uid, 2: name
        
        if r[0] == "Enter":
            users[r[1]] = r[2]
            messages.append(f'{r[1]}님이 들어왔습니다.')
        elif r[0] == "Change":
            users[r[1]] = r[2]
        else:
            messages.append(f'{r[1]}님이 나갔습니다.')

    #change_uid_to_name  
    answer = []
    for msg in messages:
        i = msg.index('님')
        uid = msg[:i]
        answer.append(msg.replace(uid, users[uid]))
    
    return answer

 

 

3. 개선 사항

위 코드에서 아쉬운 점은 출력 메시지를 담는 리스트를 messages와 answer로, 두 개를 사용한다는 것이다. 만약 각 아이디의 최종 닉네임을 알고 있다면, 곧 바로 최종 메시지를 담는 1개의 리스트만 있으면 된다. 그렇다면 미리 users 딕셔너리를 만들 순 없을까? 이를 고민하다가, 다음과 같은 코드를 떠올릴 수 있었다.

users = {r.split()[1]: r.split()[2] for r in record if r.split()[0] in ['Enter', 'Change']}

record에서 Enter이거나 Change인 경우에만 users 딕셔너리에 아이디와 닉네임을 추가한다.

이때 key는 중복을 허용하지 않는다. 예를 들어 users가 { 123: "Ryan" }일 때 users에 { 123: "Prodo" }을 추가하려고 한다면 그 결과는 위 그림처럼 { 123: "Prodo" }이다. 이 원리로 인해 users에는 각 아이디의 최종 닉네임이 저장된다.

따라서 새로 개선한 코드는 다음과 같다.

def solution(record):
    users = {r.split()[1]: r.split()[2] for r in record if r.split()[0] in ['Enter', 'Change']}
    
    answer = []
    for r in record:
        r = r.split()
        
        if r[0] == 'Enter':
            answer.append(f'{users[r[1]]}님이 들어왔습니다.')
        elif r[0] == 'Leave':
            answer.append(f'{users[r[1]]}님이 나갔습니다.')

    return answer
728x90