[프로그래머스] 42888. 오픈채팅방
문제 링크
풀이 과정
HashMap과 ArrayList 자료구조를 이용해 문제를 해결했습니다.
HashMap 에는 각 로그 정보에서 유저 아이디
, 닉네임
을 key-value 쌍으로 저장합니다.
ArrayList 에는 각 로그 정보에서 유저 아이디
와 해당 유저가 들어왔는지(Enter) 혹은 나갔는지(Leave)
의 상태 정보를 저장합니다. 예를 들어, Enter uid1234 Muzi
라는 로그에 대해서 uid1234 , Enter 쌍을 객체 정보로 관리합니다.
if (splited[0].equals("Enter")) {
map.put(splited[1], splited[2]);
list.add(new Pair(splited[1], "Enter"));
} else if (splited[0].equals("Leave")) {
list.add(new Pair(splited[1], "Leave"));
} else if (splited[0].equals("Change")) {
map.put(splited[1], splited[2]);
}
위 코드는 각 로그들을 순회하며 필요한 정보들을 저장하는 과정입니다.
Enter
시에는 맵과 리스트 모두에 정보를 저장합니다. 맵에는 채팅방에 새로 들어온 유저의 유저 아이디와 닉네임을, 리스트에는 해당 유저가 채팅방을 들어왔다는 기록을 저장합니다.Leave
시에는 리스트에만 추가함으로써, 해당 유저가 채팅방을 나갔다는 기록을 남깁니다.Change
시에는 맵에 해당 키를 새로 추가해 닉네임 변경을 반영시킵니다.
for (Pair pair : list) {
answer.add(map.get(pair.uid) + "님이 " + (pair.status == "Enter" ? "들어왔습니다." : "나갔습니다."));
}
위 과정을 통해 리스트에 Enter, Leave에 대한 기록이 저장되어 있다면, 이제 맵에서 유저아이디를 검색해 변경된 닉네임을 반영시켜 answer
리스트에 추가해줍니다. 이 때 Pair 객체에 저장되어 있던 유저가 들어왔는지(Enter) 혹은 나갔는지(Leave)
의 상태 정보에 따라 출력 문구를 다르게 해줍니다.
코드
import java.util.*;
public class Main {
public static List<String> solution(String[] record) {
List<String> answer = new ArrayList<>();
Map<String, String> map = new HashMap<>();
List<Pair> list = new ArrayList<>();
for (String s : record) {
String[] splited = s.split(" ");
if (splited[0].equals("Enter")) {
map.put(splited[1], splited[2]);
list.add(new Pair(splited[1], "Enter"));
} else if (splited[0].equals("Leave")) {
list.add(new Pair(splited[1], "Leave"));
} else if (splited[0].equals("Change")) {
map.put(splited[1], splited[2]);
}
}
for (Pair pair : list) {
answer.add(map.get(pair.uid) + "님이 " + (pair.status == "Enter" ? "들어왔습니다." : "나갔습니다."));
}
return answer;
}
private static class Pair {
String uid;
String status;
public Pair(String uid, String status) {
this.uid = uid;
this.status = status;
}
}
public static void main(String[] args) {
solution(new String[]{"Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo", "Change uid4567 Ryan"});
}
}
댓글남기기