이숭간 공부기록

[프로그래머스] 2019 KAKAO _ 오픈채팅방 ⭕️ 본문

알고리즘/프로그래머스

[프로그래머스] 2019 KAKAO _ 오픈채팅방 ⭕️

이숭간 2021. 5. 26. 16:47
728x90

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

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

문제유형 : 문자열, 구현

 

문제풀이 

  • ID와 닉네임을 키:값으로 갖는 딕셔너리를 이용 ( defaultdict 이용)
  • Enter와 Change일때만 딕셔너리에 해당 아이디에 딸린 닉네임을 바꿔주도록 하고 전체를 반복해서 아이디:닉네임을 저장하는 딕셔너리가 최종 구현이 되면
  • 다시 전체 포문을 돌면서 명령에 맞는 문자열로 바꿔서 출력해주면 끝

 

정답코드

from collections import defaultdict
def solution(record):
    answer = []
    dic = defaultdict(str)
    # 1. 전체입력을 돌면서 아이디(키):닉네임(값)으로 딕셔너리 생성
    # 1.1. 이때 딕셔너리에 키값이 있는데, Enter나 Change일경우 닉네임(값)을 변경한다.
    # 1.2. Leave면 그냥 넘어간다. 
    
    for i in record:
        input_list = i.split()
        order, key = input_list[0], input_list[1]
        if order == "Leave":
            continue
        val = input_list[2]
        dic[key] = val
    
    #2. 다시한번 입력을 돌면서 딕셔너리에서 해당값을 찾아서 명령에맞게 출력한다.
    for i in record:
        input_list = i.split()
        order, key = input_list[0], input_list[1]
        if order == "Enter":
            answer.append("{}님이 들어왔습니다.".format(dic[key]))
        elif order == "Leave":
            answer.append("{}님이 나갔습니다.".format(dic[key]))

    return answer

 

 

더 좋은 풀이 (다른분 풀이)

  • Enter와 Leave를 문자열로 바꾸는 과정에서 printer라는 딕셔너리를 사용해서 if문을 사용하지 않아도 됨
  • 두번째 포문에서 나는 if enter일때, leave일때를 로직을 구현하고 change일때 continue로 건너뛰도록 했는데 그렇게 하지않고 change가 아닐때만~~ 으로 구현해서 더 간단히 표현함 
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