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

🤔 문제

🔗

채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어질 때, 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.

👊 풀이과정

채팅 참여자는 퇴장 후 재입장이 가능하며, 닉네임을 변경할 경우 이전 채팅 내역의 닉네임이 모두 수정되어야 한다.
따라서 채팅 참여자의 아이디, 닉네임, 상태(입장/퇴장) 정보를 저장할 컬렉션이 필요하다.

한편, 채팅 참여자의 닉네임은 중복될 수 있다.

그렇다면 여기서 참여자를 구분할 수 있는 방법은 아이디 뿐이다.

어떤 참여자가 닉네임을 변경했는지 빠르게 탐색하고 수정하기 위해 HashMap을 사용했다.

key에는 아이디를, value에는 닉네임을 입력했다.

 

HashMap<String, String> users = new HashMap<>();

for(String r : record) {
	String[] str = r.split(" ");

	if(str[0].equals("Enter") || str[0].equals("Change")) {
		users.put(str[1], str[2]);
	}
}

split()으로 record를 분리하여 상태, 아이디, 닉네임 정보를 담은 배열 str을 생성했다.
if문을 사용해 입장/닉네임 변경 시 참여자 목록에 아이디와 닉네임을 저장했다.
key값인 아이디의 중복을 허용하지 않는 Map의 특성상 재입장/닉네임 변경 시에도 중복 저장될 우려가 없다.

record를 모두 순회하면 최종적인 닉네임이 담긴 참여자 목록이 완성된다.
이제 이를 토대로 다시 record를 순회하며 최종적으로 출력된 메세지를 리스트에 담아 리턴한다.

 

ArrayLisst<String> messages = new ArrayList<>();
for(String r : record) {
	String[] str = r.split(" ");

	switch(str[0]) {
		case "Enter" :
			messages.add(users.get(str[1])+"님이 들어왔습니다.");
			break;
		case "Leave" : 
			messages.add(users.get(str[1])+"님이 나갔습니다.");
			break;
	}
}

switch문을 사용하여 입장/퇴장 시에 메세지가 출력된다.

참여자 목록에서 key값을 사용해 닉네임 문자열을 불러오고 입퇴장 메세지와 함께 출력하였다.
출력된 메세지 리스트를 toArray()를 통해 배열로 변환해 리턴하면 끝

💻 소스코드

import java.util.ArrayList;
import java.util.HashMap;

public class 프로그래머스_2019카카오블라인드신규채용_오픈채팅방 {

	public static String[] solution(String[] record) {
		ArrayList<String> messages = new ArrayList<>();
		HashMap<String, String> users = new HashMap<>();

		for(String r : record) {
			String[] str = r.split(" ");

			if(str[0].equals("Enter") || str[0].equals("Change")) {
				users.put(str[1], str[2]);
			}
		}

		for(String r : record) {
			String[] str = r.split(" ");

			switch(str[0]) {
				case "Enter" :
					messages.add(users.get(str[1])+"님이 들어왔습니다.");
					break;
				case "Leave" : 
					messages.add(users.get(str[1])+"님이 나갔습니다.");
					break;
			}
		}
		return messages.toArray(new String[messages.size()]);
	}
}