https://programmers.co.kr/learn/courses/30/lessons/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 |