[코딩테스트 - Java] 프로그래머스 - 오픈채팅방

김수빈·2022년 8월 10일
0

코딩테스트

목록 보기
2/16

https://school.programmers.co.kr/learn/courses/30/lessons/42888

프로그래머스 - 카카오 2019 - LEVEL 2

오픈채팅방에서, 유저가 입/출입 한 기록을 남기는 문제 이다.
유의할 점은 유저의 닉네임이 변경되면 최종적으로 변경된 닉네임으로 표기해야한다는 점이다.

  1. 가장 먼저 유저의 ID와 유저의 닉네임을 담을 해시맵을 만들었다.

  2. 루프는 총 2번 돌렸다. 첫번째는 각 유저마다의 최종 닉네임을 만들기 위함이고, 두번째는 최종 닉네임으로 입/출입을 담을 것이다.

  3. 이상하게도 입/출입 기록을 바로 String 배열에 담으면 문제가 틀리고, ArrayList에 먼저 담은 후 배열로 옮기면 에러가 나지 않았다. String 타입이 immutable 한 것과 관계가 있을 지 모르겠다.

import java.util.HashMap;
import java.util.ArrayList;
class Solution {
    // 닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메세지의 닉네임도 전부 변경

    // 들어오기 / 나오기 등을 한번에 유저 id 를 이용한 stringbuilder 로 만들어 놓음
    // 마지막에 해시맵에서 유저 이름으로 변경

    public String[] solution(String[] record) {
        
        // 유저 id, 유저 이름 을 갖는 해시맵
        HashMap<String,String> hashMap = new HashMap<>();
        ArrayList<String> array = new ArrayList<>();
        
        // 첫번째 루프 (각 유저의 최종 닉네임 을 구하기)
        for(String data : record){
            String[] rec= data.split(" ");
            if(rec[0].charAt(0)=='E'){
                hashMap.put(rec[1],rec[2]);
            }
            else if(rec[0].charAt(0)=='C'){
                hashMap.put(rec[1],rec[2]);
            }
        }
        
        // 두번째 루프 (각 유저의 입/출입 기록을 ArrayList 에 담기)
        for(String data : record){
            String[] rec = data.split(" ");
            
            // Enter 일 경우
            if(rec[0].charAt(0)=='E'){
                array.add(hashMap.get(rec[1])+"님이 들어왔습니다.");
            }
            
            // Leave 일 경우
            else if(rec[0].charAt(0)=='L'){
                array.add(hashMap.get(rec[1])+"님이 나갔습니다.");
            }
        }
        

        String[] answer = new String[array.size()];
        for(int i=0;i<answer.length;i++){
            answer[i]=array.get(i);
        }
        return answer;
    }
}

0개의 댓글