난이도 ★☆☆
문제 출처
https://www.welcomekakao.com/learn/courses/30/lessons/42888
코딩테스트 연습 - 오픈채팅방 | 프로그래머스
오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. [닉네임]님이 들어왔습니다. 채팅방에서 누군가 나가면 다음 메시지가 출력된다. [닉네임]님이 나갔습니다. 채팅
www.welcomekakao.com
포인트
1. Map (key:value)
각각의 유저아이디를 통해 닉네임을 식별해야 하므로 key:value 매핑을 해주는 map을 사용하였다.
따라서 이후에 유저가 닉네임을 변경하더라도 key값(유저아이디)을 통해 닉네임 변경을 쉽게 관리할 수 있다.
2. 문자열 split 함수
record로 주어지는 String 배열은 공백을 기준으로 중요한 정보를 구분짓고 있다.
중요한 정보 :
1. 입장/퇴장/닉네임변경
2. 유저아이디
3. 유저닉네임
따라서 java의 문자열.split(" ") 함수를 사용하였다.
3. 인덱싱
정답으로 반환하는 answer 배열은 주어지는 record 배열과 사이즈가 다르기 때문에 answer배열 선언 시 정해줄 size를 미리 계산해 놓아야 한다.
이 때, 사이즈는 record 배열에 포함된 Enter와 Leave의 개수이다.
정답코드
import java.util.*; //Map 사용
class Solution {
public String[] solution(String[] record) {
int cnt=0; //정답으로 반환할 answer 배열의 사이즈
Map<String, String> map = new HashMap<String,String>();
//record를 순회하며 cnt개수 카운트하기
//map에 유저아이디와 닉네임 매핑하기
for(int i=0;i<record.length;i++){
String status=record[i].split(" ")[0];
String id=record[i].split(" ")[1];
if(status.equals("Enter")){
cnt++;
String nick=record[i].split(" ")[2];
map.put(id,nick);
}
else if(status.equals("Change")){
String nick=record[i].split(" ")[2];
map.put(id, nick);
}
else if(status.equals("Leave")){
cnt++;
}
}
//정답으로 반환할 answer배열 선언
String[] answer = new String[cnt];
//answer배열 인덱싱
int idx=0;
//record를 순회하며 입장과 퇴장 시에만 answer배열 업데이트
for(int i=0;i<record.length;i++){
String status=record[i].split(" ")[0];
String id=record[i].split(" ")[1];
if(status.equals("Enter")){
answer[idx]=map.get(id)+"님이 들어왔습니다.";
idx++;
}
else if(status.equals("Leave")){
answer[idx]=map.get(id)+"님이 나갔습니다.";
idx++;
}
}
return answer;
}
}
'알고리즘 > 카카오' 카테고리의 다른 글
(2018년)KAKAO BLIND RECRUITMENT_실패율 (1) | 2019.09.08 |
---|
댓글