본문 바로가기

코딩테스트 대비

[프로그래머스] 오픈채팅방

오늘은 신입사원 김크루의 말을 들어주자...!

김크루는 무엇을 해결해야 할까?😆

 

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

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

programmers.co.kr

문제 설명

문제가 너무 길어 요약을 하자면 문자열 배열에 맞게 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 나타내라는 것이다. 여기서 말하는 문자열 배열을 어떻게 되어있냐면 아래 표를 record의 배열을 보면 알 수 있다.

record result
["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]

예를 들어 얘기하자면 

uid1234 : Muzi Prodo 들어옴.->Muzi->Prodo

uid4567: Prodo Ryan 들어옴.->Prodo -> Ryan

uid1234 : Muzi 나감.

uid1234 : Prodo 들어옴 ->여기서 고유 아이디의 닉네임이 바뀌면 앞도 이름을 바꿔야 함.

uid4567 : Ryan 변경-> 변경으로 인해 앞에 선언된 uid4567의 이름은 모두 Ryan으로 변경되어야 함.

위와 같은 루틴을 거쳐 result가 ["Prodo 님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]로 정의된다.

이 문제는 제한 사항이 굉장히 많은데 거의 다 당연한 얘기이고 가장 중요한 제한사항은 모든 유저는 유저 아이디로 구분한다는 것이다.

결론적으로 얘기하자면 닉네임은 중복이 될 수 있다는 얘기이다.

그걸 기반으로 문제를 풀었다.

 

풀이 방법

내가 생각한 풀이 방법은 딕셔너리와 배열의 매핑이었다.

딕셔너리에는 {'user_id':'nickname'} 배열에는 [['상황', 'user_id']] 이런 식으로 저장해 두고 매핑을 해주는 것이었다.

 

왜?

이유는 유저 아이디라는 중복되는 않는 고유값과 닉네임을 매핑해서 쓰면 굉장히 편할 것이라고 생각이 들었다. 또한 상황 매핑하는 데는 튜플 또는 배열을 쓸 수 있을 것 같았는데 편히 쓸 수 있는 배열을 골랐다.

 

코드

def solution(record):
    answer = []
    d={}
    enter=[]
    
    for i in record:#돌려 돌려 돌림판
        str=i.split()#문자열을 나누고
        if str[0]=='Enter':#각 케이스 별로 나누기#
            d[str[1]]=str[2]#엔터는 딕셔너리에 각각의 아이디와 이름 저장. 
            line=[]#이부분은 들어왔는지 나갔는지 아이디와 이름 매핑하는 부분.
            line.append("in")
            line.append(str[1])
            enter.append(line)
        elif str[0]=='Leave':#리브는 나갔는지 아이디와 이름 매핑하는 부분.
            line=[]
            line.append("out")
            line.append(str[1])
            enter.append(line)
        elif str[0]=='Change':#체인지는 말그대로 아이디를 키로 이름을 바꾸는 곳.
            d[str[1]]=str[2]
        

    for k in enter:#딕셔너리와 배열 매핑해서 넣어놓기. ex) 딕셔너리에서{"uid2934":"Muiz",....} [[in],[uid2934]]-> Muiz가 들어왔습니다. 
        sentence=""
        if k[0]=='in':
            sentence=sentence+d.get(k[1])+"님이 들어왔습니다." 
        else:
            sentence=sentence+d.get(k[1])+"님이 나갔습니다." 
        answer.append(sentence)
    
    return answer

실행 결과

 

갑자기 놀고 싶어 졌다 다음 주는 한강 가서 보드 타야지 헤헤😏