본문 바로가기
  • 책과 글
알고리즘/카카오

(2018년)KAKAO BLIND RECRUITMENT_오픈채팅방

by twfnm67 2019. 9. 6.

난이도 ★☆

 

문제 출처

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

댓글