프로그래머스_오픈채팅방

임정민·2024년 1월 31일
0

알고리즘 문제풀이

목록 보기
155/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 32분


def solution(record):
    
    answer = []
    acts = {'Enter':0,'Leave':1,'Change':2}
    tmp = [] # 입장 : 0, 퇴장:1, 변경:2
    changes = {}
    
    for rec in record:

        rec = rec.split(" ")
        act, uid = rec[0], rec[1]

        if acts[rec[0]]==0 :
            tmp.append((acts[act],uid))
            name = rec[2]
            changes[uid] = name 
            
        elif acts[rec[0]]==1:
            tmp.append((acts[act],uid))
            
        else:
            name = rec[2]
            changes[uid] = name

    for x in tmp:
        act , uid = x
        if act==0:
            answer.append(changes[uid]+"님이 들어왔습니다.")
        else:
            answer.append(changes[uid]+"님이 나갔습니다.")

    return answer

유저ID와 닉네임이 포함된 입력된 오픈 채팅방 입/퇴장 내역과 닉네임 변경 내역(record)가 주어지고 유저가 닉네임을 변경할 수 있는 상황일 때,
최종적으로 변경된 오픈 채팅방 입/퇴장 내역을 구하는 문제입니다.🐹🐹🐹

유저가 할 수 있는 행동 중 'Enter', 'Leave' 일 때, 행동과 고유 유저ID를 순서대로 기억(tmp)하고 유저의 행동이 'Change'일 때는 유저가 변경한 닉네임을 초기화하여 저장해주었습니다.

이후 tmp를 돌며 마지막으로 변경한 닉네임을 토대로 유저별 입/퇴장 내역을 구하였습니다.

[다른 사람의 풀이1]

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

'나의 풀이'처럼 유저의 최종 닉네임을 기억하고 유저의 행동이 'Enter' 나 'Leave'일 때, 최종 닉네임을 기준으로 입/퇴장 내역을 기록한 방법입니다.

[다른 사람의 풀이2]

def solution(record):
    answer = []
    id_dict = dict()  # id에 해당하는 이름 정보
    commands = [list(r.split()) for r in record]  # record의 데이터들을 공백 기준으로 분리

    for command in commands:
        if command[0] == 'Enter' or command[0] == 'Change':  # id에 해당하는 닉네임 정보 생성 혹은 업데이트
            id_dict[command[1]] = command[2]

    for command in commands:
        if command[0] == 'Enter':
            answer.append(id_dict[command[1]] + "님이 들어왔습니다.")
        elif command[0] == 'Leave':
            answer.append(id_dict[command[1]] + "님이 나갔습니다.")
    return answer

똑같이 유저의 최종 닉네임을 기억한 뒤, 고유 유저ID별 최종 닉네임을 기준으로 입/퇴장 내역을 순서대로 append한 방식입니다.🐣🐣🐣

감사합니다.

profile
https://github.com/min731

0개의 댓글