https://school.programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스 - 카카오 2019 - LEVEL 2
오픈채팅방에서, 유저가 입/출입 한 기록을 남기는 문제 이다.
유의할 점은 유저의 닉네임이 변경되면 최종적으로 변경된 닉네임으로 표기해야한다는 점이다.
가장 먼저 유저의 ID와 유저의 닉네임을 담을 해시맵을 만들었다.
루프는 총 2번 돌렸다. 첫번째는 각 유저마다의 최종 닉네임을 만들기 위함이고, 두번째는 최종 닉네임으로 입/출입을 담을 것이다.
이상하게도 입/출입 기록을 바로 String 배열에 담으면 문제가 틀리고, ArrayList에 먼저 담은 후 배열로 옮기면 에러가 나지 않았다. String 타입이 immutable 한 것과 관계가 있을 지 모르겠다.
import java.util.HashMap;
import java.util.ArrayList;
class Solution {
// 닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메세지의 닉네임도 전부 변경
// 들어오기 / 나오기 등을 한번에 유저 id 를 이용한 stringbuilder 로 만들어 놓음
// 마지막에 해시맵에서 유저 이름으로 변경
public String[] solution(String[] record) {
// 유저 id, 유저 이름 을 갖는 해시맵
HashMap<String,String> hashMap = new HashMap<>();
ArrayList<String> array = new ArrayList<>();
// 첫번째 루프 (각 유저의 최종 닉네임 을 구하기)
for(String data : record){
String[] rec= data.split(" ");
if(rec[0].charAt(0)=='E'){
hashMap.put(rec[1],rec[2]);
}
else if(rec[0].charAt(0)=='C'){
hashMap.put(rec[1],rec[2]);
}
}
// 두번째 루프 (각 유저의 입/출입 기록을 ArrayList 에 담기)
for(String data : record){
String[] rec = data.split(" ");
// Enter 일 경우
if(rec[0].charAt(0)=='E'){
array.add(hashMap.get(rec[1])+"님이 들어왔습니다.");
}
// Leave 일 경우
else if(rec[0].charAt(0)=='L'){
array.add(hashMap.get(rec[1])+"님이 나갔습니다.");
}
}
String[] answer = new String[array.size()];
for(int i=0;i<answer.length;i++){
answer[i]=array.get(i);
}
return answer;
}
}