본문으로 바로가기

오픈 채팅방

카카오 블라인드 채용에 나왔던 문제이다.

오픈 채팅방에 들어오는 사람들은 각각 고유 번호가 부여되며 닉네임은 여러 명이 중복해서 사용할 수 있다.

닉네임을 변경하기 위해서는 채팅방을 나갔다가 다시 들어오거나, change 명령어로 변경하면 된다.

닉네임이 변경되면 기존에 남겨진 메시지에서도 변경된 닉네임으로 표시되도록 해야 한다.

채팅방의 사람들이 어떻게 동작했는지에 대한 정보가 주어졌을 때, 모든 동작이 완료되었을 경우 메시지가 어떻게 표시되고 있는지 반환할 수 있도록 코드를 짜시오.

프로그래머스에서 문제 보기

Github에서 코드 보기

문제 풀이

채팅방에 입장하는 사람들의 고유 Id를 Key로 하고 이름을 Value로 하는 Dictionary를 선언한다. 메시지에 보여질 행동은 'Leave'와 'Enter'다. 행동에 따라서 메시지에 출력될 내용은 actionList에 미리 저장해둔다.

입력된 records를 순회하면서 'Enter'와  'Change' 명령이 있을 때마다 채팅방의 사람들의 이름을 바꿔서 Dictionary에 저장한다. 출력할 메시지의 case는 caselist에 저장해둔다.

records의 순회가 끝나면 caseList를 순회한다. 각각의 case 별로 이름은 name_table에서 꺼내고, 알맞은 action은 actionList에서 꺼내어 메시지를 만든 다음 answer에 넣어준다. 모든 순회가 끝나면 answer 리스트를 반환하면 된다.

문제 후기

이전에 한번 풀어보았던 문제를 다시 풀어보았다 .예전에 짰던 코드와 비교도 해보고 풀이 시간도 재서 다시 코드를 짜보았다.. 블라인드 테스트에서 1번 문제였기 때문에 파이썬의 기본 컨테이너만 잘 활용한다면 길어도 15분 안에는 풀 수 있는 문제였다. 그때는 이보다는 오래 걸려서 문제를 풀었던 것 같은데.. 역시 문제는 자주, 많이 풀어보아야 한다.

파이썬 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
def solve(records):
    answer = []
    name_table = {}
    caseList = []
    actionList = {'Leave' : '님이 나갔습니다.''Enter' : '님이 들어왔습니다.'}
    for record in records:
        record = record.split(' ')
        action = record[0]
        if action != 'Leave':
            # 이름을 변경하거나 새로 생성
            name_table[record[1]] = record[2]
        if action != 'Change':
            caseList.append((action, record[1]))
 
    for action, id in caseList:
        answer.append(name_table[id] + actionList[action])
    return answer
 
if __name__ == "__main__":
    record = ["Enter uid1234 Muzi""Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]
    print(solve(record))
cs