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

유의선·2024년 3월 8일

문제 링크

중복을 허용하지 않고 <key, value> 쌍으로 데이터를 저장하는 HashMap의 특징을 이용해 문제를 풀었다.


전체 코드는 다음과 같다.

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        HashMap<String, String> hashMap = new HashMap<>();
        ArrayList<String> arrayList = new ArrayList<>();
        
        for(int i = 0; i < record.length; i++){
            String[] now = record[i].split(" ");
            
            if(now[0].equals("Enter") || now[0].equals("Change")){
                hashMap.put(now[1], now[2]);
            }
        }
        
        for(int i = 0; i < record.length; i++){
            String[] now = record[i].split(" ");
            String tmp;
            
            if(now[0].equals("Enter")){
                tmp = hashMap.get(now[1]) + "님이 들어왔습니다.";
                arrayList.add(tmp);
            }else if(now[0].equals("Leave")){
                tmp = hashMap.get(now[1]) + "님이 나갔습니다.";
                arrayList.add(tmp);
            }
        }
        
        String[] answer = new String[arrayList.size()];
        for(int i = 0; i < arrayList.size(); i++){
            answer[i] = arrayList.get(i);
        }
        
        return answer;
    }
}

<유저 아이디, 닉네임> 쌍으로 데이터를 저장할 HashMap
정답을 저장할 ArrayList를 만들었다.

class Solution {
    public String[] solution(String[] record) {
        HashMap<String, String> hashMap = new HashMap<>();
        ArrayList<String> arrayList = new ArrayList<>();

기록 배열 record의 길이만큼 반복하며
각 기록을 " " 기준으로 나누어 배열에 저장해 액션/아이디/닉네임 을 저장한다.

        for(int i = 0; i < record.length; i++){
            String[] now = record[i].split(" ");
            
            ...
        }

액션이 "Enter" 또는 "Change"인 경우에 닉네임의 변경이 발생할 수 있다.
그러므로 이러한 경우에 <아이디, 닉네임> 쌍으로 HashMap에 데이터를 넣는다.

        for(int i = 0; i < record.length; i++){
            String[] now = record[i].split(" ");
            
            if(now[0].equals("Enter") || now[0].equals("Change")){
                hashMap.put(now[1], now[2]);
            }
        }

반복문을 마치면 아이디당 최종 변경 닉네임이 HashMap에 저장된다.

다시 한번 기록 배열 record의 길이만큼 반복하며
각 기록을 " " 기준으로 나누어 배열에 저장해 액션/아이디/닉네임 을 저장한다.

        for(int i = 0; i < record.length; i++){
            String[] now = record[i].split(" ");
            
            ...
        }

액션이 "Enter" 또는 "Leave" 인 경우 채팅방 메시지에 기록이 남으므로 정답 배열에 추가해야 한다.
이 때 닉네임은 HashMap에서 key값을 아이디로 참조해서 최종적으로 변경된 닉네임을 얻는다.
액션과 닉네임으로 메시지를 만들어 정답 배열 ArrayList에 집어넣는다.

        for(int i = 0; i < record.length; i++){
            String[] now = record[i].split(" ");
            
            String tmp;
            if(now[0].equals("Enter")){
                tmp = hashMap.get(now[1]) + "님이 들어왔습니다.";
                arrayList.add(tmp);
            }else if(now[0].equals("Leave")){
                tmp = hashMap.get(now[1]) + "님이 나갔습니다.";
                arrayList.add(tmp);
            }
        }

마지막으로 정답 배열 ArrayList의 내용을 answer[] 배열에 복사하여 반환한다.

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

0개의 댓글