떼닝로그

[프로그래머스] 오픈채팅방 (Python 파이썬) 본문

Algorithms/프로그래머스

[프로그래머스] 오픈채팅방 (Python 파이썬)

떼닝 2022. 6. 30. 08:14

2019 KAKAO BLIND RECRUITMENT Level 2 오픈채팅방

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42888

 

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

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

programmers.co.kr

💡 아이디어

💡 문제를 어떤 방식으로 해결하려 했는지 그 과정을 적어주세요. 초기에 접근한 방법과 최종 접근이 차이가 없으면 한개만 적어도 됩니다.

초기 접근

생각보다 오래걸렸다. 다 하고 나니 뭐 이런 걸로 시간을 오래 끈 거야 싶은... 그냥 무지성 코딩의 절정을 찍은 것 같다.

그냥 문제 읽으면서 코드를 적었더니...

그리고 시간복잡도 생각 안 하고 그냥 문자열을 일일이 다 split하고 문자열 안에서 또 문자열을 찾고... 2중으로 for문 돌리고 했더니 시간 초과가 나버렸다.

최종 접근

그래서 최종적으로는 문자열 비교를 최소한으로 하려고 했다. 그래봐야 또 split하고 비교하는 건 마찬가지지만...

자잘하게 설명할 건 없고... 큼직하게 말해보자면...

 

아이디와 닉네임 사이의 관계를 나타내고 있는 딕셔너리가 있다.

방에 입장하면 딕셔너리에 추가되고, 이름을 바꾸면 딕셔너리 내에서 아이디에 따라 이름이 바뀌게 된다.

그리고 그냥 마지막에 다시 한 번 돌면서 들어오고, 나가고에 대한 텍스트를 처리해주면 된다.

여기서 닉네임은 역시나 그 딕셔너리에서 가져오는.

 

이렇게 쉬운 문젠데 왜 이렇게 헤매고 오래 걸렸는지 모르겠다... 실제 시험이었으면 시간 부족해서 못했을듯...

그러고 후회 잔뜩 했겠지...

📋 사용 스펙

💡 어떤 알고리즘 또는 기법을 사용해 문제를 해결했는지 알려주세요

 Python의 dict 자료형

👨🏻‍💻 👩‍💻 코드

def solution(record):
    answer = []
    
    # 아이디와 닉네임 매치시키기 위한 딕셔너리
    id_nick = {}
    # 들어감과 나감만 기록하기 위한 리스트
    order_list = []
    
    # 레코드 돌면서
    for rec_ in record:
        rec = rec_.split()
        # 입장일 경우 딕셔너리에 아이디와 닉네임 저장 후
        # 오더리스트에 Enter했음을 나타내는 1과 아이디 저장
        if rec[0] == "Enter":
            id_nick[rec[1]] = rec[2]
            order_list.append([1, rec[1]])
        # 닉네임 변경일 경우 딕셔너리에서 아이디 찾아서 닉네임만 변경
        elif rec[0] == "Change":
            id_nick[rec[1]] = rec[2]
        # 퇴장일 경우 오더리스트에 Leave했음을 나타내는 0과 아이디 저장
        else:
            order_list.append([0, rec[1]])
            
    # 오더리스트 돌면서 enter, leave 구별
    # 닉네임은 id_nick의 최종 결과에서 아이디를 기준으로 검색해서 가져옴
    for order in order_list:
        ans_str = f"{id_nick[order[1]]}님이 "
        if order[0] == 1:
            ans_str += "들어왔습니다."
        else:
            ans_str += "나갔습니다."
        answer.append(ans_str)
    
    
    return answer

 

Comments