[문제풀이] 오픈 채팅방
업데이트:
2019 Kakao Blind Recruitment 기출 문제
문제 링크 : 오픈 채팅방
풀이 시간 : 15분
1. 문제 풀이
Change가 들어오면 그 전에 출력하는 것도 닉네임이 바뀌어야 한다.
모든 입력을 검토하여 Change에 대한 처리를 한 후 출력을 한다.
1) 모든 입력에 대한 처리를 해준다.
2-1) Enter일 때 order와 id를 저장 후 유저 아이디를 Key로 사용하는 HashMap에 닉네임을 저장한다.
2-2) Leave일 때 order와 id만 저장
2-3) Change일 때 HashMap에 새로운 닉네임만 저장
3) order 및 id를 뽑으면서 출력에 맞게 answer에 저장해준다.
2. 소스 코드
static public String[] solution(String[] record) {
String[] answer;
// 아이디를 key, 닉네임을 value로 저장
HashMap<String, String> hm = new HashMap<String, String>();
// Enter, Leave만 저장 Change는 출력하지 않기 때문
LinkedList<String> order = new LinkedList<String>();
// Enter, Leave에 맞춰서 그때 아이디를 저장
LinkedList<String> id = new LinkedList<String>();
for (int i = 0; i < record.length; i++) {
StringTokenizer st = new StringTokenizer(record[i]);
String temp_order = st.nextToken();
String temp_id = st.nextToken();
// 앞자리가 다 다르기 때문에 그 부분만으로 분기 처리
if(temp_order.charAt(0)=='E') {
// Enter일 때
order.add(temp_order);
id.add(temp_id);
// 아이디와 닉네임 저장
hm.put(temp_id, st.nextToken());
}else if(temp_order.charAt(0)=='L') {
// Leave일 때
order.add(temp_order);
id.add(temp_id);
}else {
// Change일 때 닉네임만 바뀐다
hm.put(temp_id, st.nextToken());
}
}
int i = 0;
answer = new String[order.size()];
// 출력 형식에 맞춰서 저장
while(!order.isEmpty()) {
String temp_order = order.poll();
String name = hm.get(id.poll());
if(temp_order.charAt(0)=='E') {
answer[i] = name+"님이 들어왔습니다.";
}else {
answer[i] = name+"님이 나갔습니다.";
}
i++;
}
return answer;
}
3. 후기
HashMap을 이용해서 유저 아이디를 처리하면 되는 문제였다.