✨ 공부 기록/알고리즘

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

LaonMoon 2025. 2. 25. 14:20

아이디어 : Change가 나오는 경우에만 닉네임이 바뀌기 때문에 Change가 나오면 해당 아이디의 닉네임을 최종적인 Change 값으로 바꾸고 Enter와 Leave 부분을 print 한다. => 나갔다가 들어오는 경우에도 닉네임이 바뀌기 때문에 그 부분을 고려하여야 한다! 나가는 건 신경쓰지 말고 들어오는 부분(Enter)을 신경쓰면 된다.

 

그리고 Leave의 경우 이름이 포함되어 있지 않기 때문에 아이디-이름을 관리하는 리스트(튜플)이 따로 필요하다.

 

# 첫 번째 시도 (시간 초과 경우 발생)

def solution(record):
    id_name_list = []
    splited_list = []
    for data in record:
        splited = data.split()
        splited_list.append(splited)
        if splited[0]=="Enter" or splited[0]=="Change":
            id_name_list.append([splited[1],splited[2]])
    
    for id_name in id_name_list:
        for splited in splited_list:
            if id_name[0]==splited[1] and splited[0]!="Leave":
                splited[2]=id_name[1]
    
    # final print
    answer = []
    for splited in splited_list:
        if splited[0]=="Enter":
            answer.append(splited[2]+"님이 들어왔습니다.")
        elif splited[0]=="Leave":
            for id_name in id_name_list:
                if id_name[0]==splited[1]:
                    name = id_name[1]
            answer.append(name+"님이 나갔습니다.") 
    
    return answer

 

 

# 두 번째 시도

 

중복되는 항목들을 없애기 위해서 dictionary로 저장하는게 더 나을 것 같다는 생각이 들었다.

 

def solution(record):
    # id_name 수정 dict 만들기
    id_name_dict = {}
    splited_list = []
    for data in record:
        splited = data.split()
        splited_list.append(splited)
        if splited[0]=="Enter" or splited[0]=="Change":
            id_name_dict[splited[1]] = splited[2]
    
    # 수정 dict 반영하고 바로 answer에 담기
    answer = []
    for splited in splited_list:
        if splited[0]=="Enter":
            name = id_name_dict[splited[1]]
            answer.append(name+"님이 들어왔습니다.")
        elif splited[0]=="Leave":
            name = id_name_dict[splited[1]]
            answer.append(name+"님이 나갔습니다.") 
    return answer