[문제풀이] 오픈 채팅방

업데이트:

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을 이용해서 유저 아이디를 처리하면 되는 문제였다.