프로그래머스

[프로그래머스 Level2] 오픈채팅방 (JAVA) - 2019 Kakao

쿠쿠s 2022. 1. 11. 22:57

[문제]

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

 

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

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

programmers.co.kr

 


[문제 풀이]

StringTokenizer , HashMap, List 를 사용하여 풀 수 있습니다.

 

-record에 있는 각 단어는 공백으로 구분되기 때문에 StringTokenizer를 활용하여 값을 토큰화 하여 사용한다.

-HashMap 에 아이디(key)와 닉네임(value) 로 저장을 하게 되는데 key 값은 같은데 value만 다르면 새롭게 추가하지않고 해당 key 에 value 를 넣게된다.

-ArrayList 에 명령어를 입력받아 key값에 따른 문구를 저장한다. 

  • record 의 입력이 공백으로 주어져 StringTokenizer를 사용하여 Enter, Leave, Change 를 입력받는다.
  • 'Enter' 와 'Change' 으로만 닉네임이 변경되기 때문에 먼저 닉네임을 HashMap( 아이디(key), 닉네임(value))으로 저장한다.  
  • 그다음 Enter 와 Leave 에서  ID에 따라 닉네임 + "들어왔습니다" , "나갔습니다" 를 각각 List에 담는다.
  • answer배열을 List의 Size만큼 크기를 만들어주고 List를 toArray 써서 배열에 넣어주면 완성입니다.

 


[소스 코드]

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
	        String[] answer = {};
	        
	        Map<String, String> idMap= new HashMap<>();
	        List<String> chatLog = new ArrayList<>();
	    
	        for(String str : record) {
	        	StringTokenizer st = new StringTokenizer(str);
	        	String cmd = st.nextToken();
	        	if(cmd.equals("Enter") || cmd.equals("Change")) {
	        		String id = st.nextToken();
	        		String name = st.nextToken();
	        		
	        		idMap.put(id, name);
	        	}        	
	        }
	        
	        for(String str : record) {
	        	StringTokenizer st = new StringTokenizer(str);
	        	String cmd = st.nextToken();
	        	if(cmd.equals("Enter")) {
	        		String id = st.nextToken();
	        		String name = idMap.get(id);
	        		chatLog.add(name + "님이 들어왔습니다.");
	        	}else if(cmd.equals("Leave")) {
	        		String id = st.nextToken();
	        		String name = idMap.get(id);
	        		chatLog.add(name + "님이 나갔습니다.");
	        	}
	        }
	        answer = new String[chatLog.size()];
	        
	        chatLog.toArray(answer);
	        
	        return answer;
    }
}

-참고 https://www.youtube.com/watch?v=TFMDF-BVOAs (ezsw)