PIDGEY
PIDGEY's Dev. BLOG
PIDGEY
전체 방문자
오늘
어제
  • 분류 전체보기 (30)
    • 개발 (28)
      • Java (6)
      • Spring Framework (4)
      • Design Pattern (7)
      • CS (0)
      • Algorithm (8)
      • React.JS (2)
    • 일기 (2)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

hELLO · Designed By 정상우.
PIDGEY

PIDGEY's Dev. BLOG

개발/Algorithm

[Java] 오픈채팅방 (2019 KAKAO BLIND RECRUITMENT)

2023. 6. 30. 07:40

문제 설명

상세한 문제 설명은 프로그래머스에서 확인할 수 있습니다.

카카오톡 오픈채팅방에서 채팅방에 입장 / 퇴장 메시지 출력을 구현하는 문제입니다.
이미 출력된 메시지에 표시된 닉네임은 기존 사용자가 닉네임을 변경할 때 전부 변경됩니다.

"Muzi님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Muzi님이 나갔습니다."

위 상황에서 Muzi가 나간 후에, Prodo라는 닉네임으로 다시 들어올 경우 기존 채팅방에 남아있던 메시지의 Muzi도 Prodo로 변경됩니다.
닉네임의 중복은 허용하기 때문에 표시되는 닉네임은 겹칠 수 있습니다.

"Prodo님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."

이 때, 기존의 Prodo 닉네임을 사용하던 사용자가 Ryan으로 변경하면 아래와 같이 메시지가 변경됩니다.

"Prodo님이 들어왔습니다."
"Ryan님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."

입장 / 퇴장 / 닉네임 변경에 담긴 채팅방 로그 배열 record가 주어지면 채팅방에 출력되는 메시지 배열을 출력하세요.

제한 사항

  • record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
  • 다음은 record에 담긴 문자열에 대한 설명이다.
    • 모든 유저는 [유저 아이디]로 구분한다.
    • [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디] [닉네임]" (ex. "Enter uid1234 Muzi")
    • [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
    • [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디] [닉네임]" (ex. "Change uid1234 Muzi")
    • 첫 단어는 Enter, Leave, Change 중 하나이다.
    • 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져 있다.
    • 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
    • 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
    • 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못된 입력은 주어지지 않는다.

입출력 예시

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

풀이

사용자 식별자가 입력 데이터에서 주어지므로 Map을 사용하여 닉네임을 관리하면 됩니다.
이때, 나간 사용자의 닉네임도 보관해야 함을 주의합니다.

코드

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        List<String> answer = new ArrayList<>();
        
        // 사용자의 닉네임을 관리하기 위해 Map을 사용합니다.
        Map<String, String> nickname = new HashMap<>();
        for (String r : record) {
            String[] s = r.split(" ");
            
            // 들어오거나 변경되는 경우에만 반영하고 나간 경우는 유지시킵니다.
            if (s[0].equals("Enter") || s[0].equals("Change")) {
                nickname.put(s[1], s[2]);
            }
        }
        
        for (String r : record) {
            String[] s = r.split(" ");
            
            if (s[0].equals("Enter")) {
                answer.add(nickname.get(s[1]) + "님이 들어왔습니다.");
            } else if (s[0].equals("Leave")) {
                answer.add(nickname.get(s[1]) + "님이 나갔습니다.");
            }
        }
        
        return answer.toArray(String[]::new);
    }
}
저작자표시 비영리 동일조건 (새창열림)

'개발 > Algorithm' 카테고리의 다른 글

[Java] 다음 큰 숫자 (Programmers, Level 2)  (0) 2023.07.18
[Java] 영어 끝말잇기 (프로그래머스 Summer/Winter Coding(~2018))  (0) 2023.06.26
[Java] 성격 유형 검사하기 (2022 KAKAO TECH INTERNSHIP)  (0) 2023.06.26
[Java] 크레인 인형뽑기 게임 (2019 카카오 개발자 겨울 인턴십)  (0) 2023.06.26
[Java] 백준 2178번: 미로 탐색  (0) 2023.01.05
    '개발/Algorithm' 카테고리의 다른 글
    • [Java] 다음 큰 숫자 (Programmers, Level 2)
    • [Java] 영어 끝말잇기 (프로그래머스 Summer/Winter Coding(~2018))
    • [Java] 성격 유형 검사하기 (2022 KAKAO TECH INTERNSHIP)
    • [Java] 크레인 인형뽑기 게임 (2019 카카오 개발자 겨울 인턴십)
    PIDGEY
    PIDGEY

    티스토리툴바