[PG42888] 오픈채팅방
✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/프로그래머스

[PG42888] 오픈채팅방

프로그래머스

https://programmers.co.kr/learn/courses/30/lessons/42888

 

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

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

programmers.co.kr

프로그래머스 #42888

🚩 문제 설명

◾ 오픈채팅방의 사용자 로그를 찍는 문제

◾ 명령어

  • Enter: 오픈채팅방 입장
  • Change: 오픈채팅방 닉네임 변경
  • Leave: 오픈채팅방 퇴장

◾ 닉네임 변경 방법 2가지

  • 채팅방을 나간 후 ➡ 새로운 닉네임으로 다시 입장
  • 채팅방에서 닉네임 변경

◾ 명령어에 따라서 메세지가 출력이 되고 해당 메세지들을 유저 닉네임에 맞게 출력해야한다.

◾ 명령어에 따른 상황은 다음과 같다.

◾ 사용자가 입장하면 [유저 닉네임님이 들어왔습니다.] 하고 메세지가 찍힌다.

◾ 사용자가 퇴장하면 [유저 닉네임님이 나갔습니다.] 하고 메세지가 찍힌다.

◾ 사용자가 닉네임을 변경하면 찍혀있던 로그의 닉네임이 변경된다.

 

 

 


 

 

 

✅ 입출력

record: 명령어 기록이 담긴 문자열 배열
return ➡️ 사용자들의 로그 문장들이 찍힌 배열을 반환
record result
["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]

✔️ 예시

record 설명 log
"Enter uid1234 Muzi" uid1234가 채팅방에 입장 "Muzi님이 들어왔습니다."
"Enter uid4567 Prodo" uid4567가 채팅방에 입장 "Muzi님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Leave uid1234" uid1234가 채팅방 퇴장 "Muzi님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Muzi님이 나갔습니다."
"Enter uid1234 Prodo" uid1234가 닉네임 변경후 채팅방 입장
"Muzi" ➡ "Prodo"
"Prodo님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."
"Change uid4567 Ryan" uid4567이 닉네임 변경
"Prodo" ➡ "Ryan"
"Prodo님이 들어왔습니다."
"Ryan님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."

◾ 닉네임 중복이 가능하다.

변경된 닉네임에 맞게 로그가 찍혀야한다.

 

 

 


 

 

 

📑 문제 풀이

with 파이썬 (Python)
commands = ['Enter', 'Leave', 'Change']
desc = ['님이 들어왔습니다.', '님이 나갔습니다.']


def solution(record):
    ans = [] # 해답: 문장이 찍히는 로그
    nickLog = {} # 사용자 닉네임 저장
    enterLog = {} # 사용자가 입장하는 로그
    cnt = 0 # 입장 카운터

    for re in record:
        splited = re.split()
        com = splited[0] # 명령어
        user = splited[1] # 유저 아이디

        if user not in enterLog.keys():
            enterLog[user] = []

        # Enter
        if com == commands[0]:
            nick = splited[2]
            # 닉네임 변경시
            if user in nickLog.keys():
                nickLog[user] = nick
                ans.append(nick + desc[0])
                for e in enterLog[user]:
                    com_ = ans[e].split()[1]
                    if com_ == "들어왔습니다.":
                        ans[e] = nick + desc[0]
                    else:
                        ans[e] = nick + desc[1]
            # 처음 들어왔을 시
            else:
                enterLog[user].append(cnt)
                nickLog[user] = nick
                ans.append(nick + desc[0])

        # Leave
        if com == commands[1]:
            nick = nickLog[user]
            enterLog[user].append(cnt)
            ans.append(nick + desc[1])

        # Change
        if com == commands[2]:
            nick = splited[2]
            nickLog[user] = nick
            for e in enterLog[user]:
                com_ = ans[e].split()[1]
                if com_ == "들어왔습니다.":
                    ans[e] = nick + desc[0]
                else:
                    ans[e] = nick + desc[1]


        cnt += 1
    return ans

◾ 계속 런타임 에러가 뜬다..

 

📝 다른 풀이

def solution(record):
    ans = []
    nickLog = {}

    for re in record:
        splited = re.split()
        if len(splited) == 3:
            user = splited[1]
            nick = splited[2]
            nickLog[user] = nick

    for re in record:
        splited = re.split()
        com = splited[0]
        user = splited[1]
        if com == "Enter":
            ans.append(nickLog[user] + "님이 들어왔습니다.")
        if com == "Leave":
            ans.append(nickLog[user]+"님이 나갔습니다.")

    print(ans)
    return ans

💬 Point

➡️  반복문 두번 돌기
➡️  딕셔너리를 이용하여 유저의 nick을 변경

◾ 우선 반복문을 두번 돈다.

◾ 한번 돌면서 유저의 닉네임을 변경한다.

◾ 나머지 반복문을 돌면서 ans 배열에 메세지를 추가한다.

 

 

 

 

 

 

 

 

 

 

 

 


 

728x90

'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 프로그래머스' 카테고리의 다른 글

[PG42586] 기능개발  (0) 2021.11.23
[PG12901] 2016년  (0) 2021.11.23
[PG42860] 조이스틱  (0) 2021.11.06
[PG42840] 모의고사  (0) 2021.11.06
[PG64061] 크레인 인형뽑기 게임  (0) 2021.11.06