본문 바로가기
코딩테스트/프로그래머스

[프로그래머스/java] 오픈채팅방 - 2019 KAKAO BLIND RECRUITMENT - 리스트(List)를 배열(Array)로

by drCode 2022. 4. 5.
728x90
반응형
프로그래머스 오픈채팅방


https://programmers.co.kr/learn/courses/30/lessons/42888?language=java

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr


이 문제의 핵심은 "최종적으로 관리자에게 보여지는 닉네임의 출입 상태"를 리턴하면 되는 것.

아이디에 따라 닉네임이 변화되는 모습을 보면

(1) "Enter uid1234 Muzi"
uid1234 : Muzi

(2) "Enter uid4567 Prodo"
uid1234 : Muzi
uid4567 : Prodo

(3) "Leave uid1234"
uid1234 : Muzi
uid4567 : Prodo

(4) "Enter uid1234 Prodo"
uid1234 : Prodo
uid4567 : Prodo

(5) "Change uid4567 Ryan"
uid1234 : Prodo
uid4567 : Ryan

결론적으로 uid1234는 Prodo이고, uid4567은 Ryan이다.

나는 이 문제를 풀기 위해서 Map을 사용하였다.

Key를 ID(uid)로 주었고, ID는 변하지 않은 채로 값이 바뀔 수 있기 때문이다.

닉네임이 변하는 경우는
(1) 같은 아이디로 재접속 시
(2) 닉네임을 Change 명령어를 이용하여 변경 시

그렇기 때문에, Leave 명령어만 예외처리를 하여 처리하면 된다.

그리고 리턴할 문자열 배열을 위해 list.toArray(new String[list.size()]);
를 사용하여 별도의 문자열 배열을 생성하지 않고도 리턴할 수 있었다.

package implementation.openChatting;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class OpenChatting {
	public static void main(String[] args) {
		String[] record = {"Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"};
		Solution s = new Solution();
		System.out.println(Arrays.toString(s.solution(record)));
	}
}

class Solution {
	Map<String, String> map = new HashMap<String, String>();
	
    public String[] solution(String[] record) {
        List<String> command = new ArrayList<String>();
        List<String> idList = new ArrayList<String>();
        
        List<String> rtnList = new ArrayList<String>();
        
        for (int i = 0; i < record.length; i++) {
			String[] arr = record[i].split(" ");
			command.add(arr[0]);
			idList.add(arr[1]);
			
			if(!"Leave".equals(arr[0])) map.put(arr[1], arr[2]);
		}
        
        for (int i = 0; i < command.size(); i++) {
			String name = map.get(idList.get(i));
			String cmd = command.get(i);
			
			switch(cmd) {
				case "Enter" :
					rtnList.add(name + "님이 들어왔습니다.");
					break;
				case "Leave" :
					rtnList.add(name + "님이 나갔습니다.");
					break;
			}
		}
        
        return rtnList.toArray(new String[rtnList.size()]);
    }
}
728x90
반응형

댓글