오픈채팅방

유태형·2022년 3월 21일

문제


문제 분석

나갔다가 다시 들어오거나, 닉네임을 수정하거나 해서 닉네임이 항상 바뀔수 있고 결과는 바뀐 닉네임만 처음부터 마지막 까지 보여줘야 하는 문제입니다.




풀이

변하지 않는 유저ID가 주어집니다. 유저 ID로 자유롭게 바뀔 수 있는 닉네임해시맵을 이용하여 찾는다면 항상 찾을 수 있을 것 입니다.



순서

  1. 해시맵에 유저ID, 닉네임 등록
  2. 현재의 닉네임으로 모든 기록 출력


해시맵에 유저ID, 닉네임 등록

변하지 않는 유저ID를 해시맵의 키로 자유롭게 바뀔 수 있는 닉네임를 해시맵의 값으로 지정하면 항상 ID -> 닉네임 변환이 가능합니다.

		HashMap<String,String> hash = new HashMap<>(); //유저ID, 닉네임으로 해시맵 구성
        
		for(String s : record){ //한 사건당 닉네임 구분을 위해
            String[] temp = s.split(" ");
            switch(temp[0]){
                case "Enter":
                case "Change": //입장, 변경
                    hash.put(temp[1],temp[2]); //id, 닉네임 저장
                    break;
            }
        }

문자열에서 split(" ")시 단어 단위로 나누어 배열에 저장합니다.
temp[0] : 행동
temp[1] : id
temp[2] : 닉네임

입장과 닉네임 변경시에만 해시맵의 닉네임을 입력,수정합니다.



현재의 닉네임으로 모든 기록 출력

평소와는 다르게 String+연산이 아닌 StringBuilderappend()메서드를 이용해 보았습니다.

		//출력 배열 해시로 id->닉네임
        for(String s: record){
            String[] temp = s.split(" ");
            StringBuilder sb = new StringBuilder();
            String id = temp[1]; //ID
            sb.append(hash.get(id) + "님이 "); //닉네임
            
            switch(temp[0]){
                case "Enter": //입장
                    sb.append("들어왔습니다.");
                    answer.add(sb.toString());
                    break;
                case "Leave": //퇴장
                    sb.append("나갔습니다.");
                    answer.add(sb.toString());
                    break;
            }
        }

닉네임 변경은 출력을 안하므로 입장과 퇴장시에만 결과를 출력합니다.




코드

import java.util.*;

class Solution {
public String[] solution(String[] record) {
HashMap<String,String> hash = new HashMap<>(); //유저ID, 닉네임으로 해시맵 구성
ArrayList answer = new ArrayList<>(); //결과 저장

    for(String s : record){ //한 사건당 닉네임 구분을 위해
        String[] temp = s.split(" ");
        switch(temp[0]){
            case "Enter":
            case "Change": //입장, 변경
                hash.put(temp[1],temp[2]); //id, 닉네임 저장
                break;
        }
    }
   
    //출력 배열 해시로 id->닉네임
    for(String s: record){
        String[] temp = s.split(" ");
        StringBuilder sb = new StringBuilder();
        String id = temp[1]; //ID
        sb.append(hash.get(id) + "님이 "); //닉네임
       
        switch(temp[0]){
            case "Enter": //입장
                sb.append("들어왔습니다.");
                answer.add(sb.toString());
                break;
            case "Leave": //퇴장
                sb.append("나갔습니다.");
                answer.add(sb.toString());
                break;
        }
    }
   
    return answer.toArray(new String[answer.size()]); //결과출력
}

}




GitHub

https://github.com/ds02168/Study_Algorithm/commit/e40e17bf98b7cfa27155072c87182f43e2f4ae71

profile
오늘도 내일도 화이팅!

0개의 댓글