본문 바로가기
PS(Problem Solving)/프로그래머스_Programmers

[프로그래머스] 2019 카카오 공채 - 오픈채팅방 (파이썬) 문제 및 풀이

by 초코칩프라푸치노 2021. 3. 4.

문제) 프로그래머스 - 2019 카카오 공채 - 오픈채팅방

-> 코딩테스트 연습 - 오픈채팅방 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

 

① 나의 풀이

Dictionary 형태로 record의 유저 아이디와 닉네임을 취합하기 위해서 collections의 Counter 모듈을 이용하자. 각 record의 원소를 split 하여 order 리스트로 받아준다. record탐색을 두 번 해주는데, 첫 탐색에서 유저 아이디에 대한 최종 닉네임을 결정해주고 두 번째 탐색에서 

유저 아이디에 대한 해당 기록을 answer 리스트에 넣어준다.

 

문제를 읽어보면 제약 사항에서 "채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못된 입력은 주어지지 않는다"가 주어진다. 유저 아이디를 탐색할 때, 우리는 record에 담긴 문자열이 Enter인지 Change인지만 확인해 유저 아이디와 닉네임의 정보를 담은 dictionary를 업데이트해준다.

 

두 번째 탐색에서는 기록을 answer 리스트에 넣어준다. record에 담긴 문자열이 Change이면 기록에 영향을 주지 않기 때문에 Enter과 Leave일 때 유저 아이디에 해당하는 닉네임을 불러와 answer 리스트에 추가한다.

 

 

 

소스 코드)

from collections import Counter

def solution(record):
    answer = []
    info = Counter()
    #첫 탐색
    for line in record:
        order = list(line.split())
        
        if order[0] == 'Enter':
            uid, name = order[1], order[2]
            
            if uid in info.keys():
                info[uid] = name
            else:
                info.setdefault(uid, name)

        elif order[0] == 'Change':
            uid, name = order[1], order[2]
            info[uid] = name
	
    #두 번째 탐색
    for line in record:
        order = list(line.split())
        
        if order[0] == 'Enter':
            uid, name = order[1], order[2]
            answer.append(f"{info[uid]}님이 들어왔습니다.")
            
        elif order[0] == 'Leave':
            answer.append(f"{info[order[1]]}님이 나갔습니다.")
            
    return answer

 

 

② 다른 사람 풀이

⊙ Simple is Best

 

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

 

내 풀이와 알고리즘은 같지만 아주 간단하게 해결하였다. 보기 좋은 떡이 먹기도 좋다고 코드가 간결할수록 눈으로 디버깅하기도 쉬워 오류를 빠르게 해결할 수 있다. 더 간단하게 최적화하도록 하자.

 

 

 

반응형

댓글