본문 바로가기
알고리즘/Solving

[Programmers 파이썬] 오픈채팅방 Dict 활용

by 베어 그릴스 2022. 6. 22.
320x100
 

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

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

programmers.co.kr

카카오 공개채용 2019년 문제이다.

 

문제를 읽으면 알겠지만, id와 닉네임의 동기화가 중요하다.

이때 모두 Enter 시 모두 리스트에 저장해놓고 탐색해도 되겠지만 보나마나 O(n)을 for문안에 넣으면 O(n^2)이 되어버려서 시간초과 날것임이 직감적으로 느껴졌다. 

코딩테스트 문제를 풀때나, 프로그래밍 할 때나 마찬가지겠지만, 반복문 안에서 list를 탐색하는 등의 시간의 n시간 이상 걸리는 작업은 웬만하면 하지 않는게 좋다😎

 

그래서 난 Dict 자료구조를 사용했는데,

리스트처럼 인덱스로만 내부의 아이템을 접근할 수 있는것이 아니라 정말 사전처럼 key값으로 id 값 등의 문자열도 넣어서 사용할 수 있는 자료구조이다.

즉, dict에 { 'key' : 'value' }쌍으로 데이터를 저장해놓으면, list에서 value값을 탐색하는 과정을 생략하고

dict['key']로 O(1)시간 안에 접근할 수 있다는 장점이 있다.

 

코드는 간단하다.

 

def solution(record):
    answer = []

    temp = dict()

    for str in record:
        li = str.split()
        if li[0] == "Enter" or li[0] == "Change":
            temp[li[1]] = li[2]

    for str in record:

        li = str.split()


        if len(li) == 2:
            answer.append(temp[li[1]]+"님이 나갔습니다.")
            continue

        if li[0] == "Enter":
            answer.append(temp[li[1]]+"님이 들어왔습니다.")


    return answer

먼저 dict 에 Enter시 해당 id와 nickname을 key value 쌍으로 해서 넣어주고, change 시 마찬가지로 해당 key인 id에 해당하는 value nickname을 update해주었다. 

 

이후 record를 돌며 출력해주면 된다.

 

간단한 구현이지만, dict를 생각하지 못했다면 매우 어렵게 다가올 수도 있는 문제같다🙄

728x90