[프로그래머스] 오픈채팅방

AI·2025년 9월 9일

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

import java.util.*;
class Solution {
    public String[] solution(String[] record) {
        List<String> msg = new ArrayList<>();
        HashMap<String, String> user = new HashMap<>();
        // map으로 uid 및 이름 저장
        // 바꾸면 전부 바뀜
        // Enter uid -> 입장
        // Leave uid -> 퇴장
        // Change -> uid 닉네임 변경
        for(int i=0;i<record.length;i++){
            String[] s = record[i].split(" ");
            switch(s[0]){
                case "Enter":
                    // 입장
                    user.put(s[1], s[2]);
                    msg.add(s[1]+" 님이 들어왔습니다.");
                    break;
                case "Leave":
                    // 퇴장
                    msg.add(s[1]+" 님이 나갔습니다.");
                    break;
                case "Change":
                    // 이름 변경
                    // uid가 없는데 이름 변경하는 경우도 있나?
                    user.replace(s[1],s[2]);
                    break;
            }
        }

        String[] answer = new String[msg.size()];
        int i = 0;
        for(String s : msg){
            String[] key = s.split(" ",2); // 2개로 나누겠다는 의미
            answer[i++] = user.get(key[0])+key[1];
        }
        return answer;
    }
}

==

public String[] solution(String[] record) {
        
        // Enter, Leave 에 대한 메시지
        HashMap<String, String> msg = new HashMap<>();
        msg.put("Enter", "님이 들어왔습니다.");
        msg.put("Leave", "님이 나갔습니다.");
        
        // uid, 닉네임 관리 <= 닉네임이 변경되면 덮어쓴다. (최신화, 현행화)
        // record 를 하나씩 확인하면서 uid, 닉네임이 변경되는 항목 (Enter, Change) 을 처리
        // 최종적인 답 ( 채팅 메시지 ) 는 Enter, Leave 로 구성되는 데, 현재 최종 닉네임을 사용해서 만들어야 한다.
        // 이걸 위해서 미리 uid 에 최종적인 닉네임을 관리
        HashMap<String, String> uid = new HashMap<>();
        
        for (String s : record) {
            String[] cmd = s.split(" "); // "Enter uid1234 Muzi" => {"Enter", "uid1234", "Muzi"} 
            if( cmd.length == 3 ) { // Enter, Change
                uid.put(cmd[1], cmd[2]);
            }
        }
        
        // 정답을 위한 자료구조 List
        ArrayList<String> answer = new ArrayList<>();
        for (String s : record) {
            String[] cmd = s.split(" "); // "Enter uid1234 Muzi" => {"Enter", "uid1234", "Muzi"} 
            if( msg.containsKey( cmd[0]) ) {
                answer.add( uid.get( cmd[1] ) + msg.get( cmd[0] ));
            }
        }
        
        return answer.toArray(new String[0]);
    }

=>

import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;
// uid 고정된 값, 닉네임은 변경 <= key, value 로 관리하는 HashMap 자료구조
// 채팅 메시지에는 변경 부분은 없다. 들어오고, 나가는 것만 관리
// 교재 풀이는 메시지 구조를 HashMap 으로 관리 (X)
// for each : for (String s : record) { <= 내부적으로 Iterator 객체가 생성이 되어서 이 객체가 순회를 담당
//    배열의 크기가 크면 index 기반이 더 빠른다.
// StringTokenizer
// split() 대신 맨 앞글자 비교
public class Solution{
    public static void main(String[] args) {
        String[] r = {"Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"};
        new Solution_오픈채팅방2().solution(r);
    }
    
    public String[] solution(String[] record) {
        
        // uid, 닉네임 관리 <= 닉네임이 변경되면 덮어쓴다. (최신화, 현행화)
        // record 를 하나씩 확인하면서 uid, 닉네임이 변경되는 항목 (Enter, Change) 을 처리
        // 최종적인 답 ( 채팅 메시지 ) 는 Enter, Leave 로 구성되는 데, 현재 최종 닉네임을 사용해서 만들어야 한다.
        // 이걸 위해서 미리 uid 에 최종적인 닉네임을 관리
        HashMap<String, String> uid = new HashMap<>();
        
        for (int i = 0; i < record.length; i++) {
            char first = record[i].charAt(0); // 맨 앞글자
            if( first == 'E' || first == 'C' ) {
                StringTokenizer st = new StringTokenizer(record[i]);
                st.nextToken();
                uid.put(st.nextToken(), st.nextToken());
            }
        }
        // StringBuilder
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < record.length; i++) {
            char first = record[i].charAt(0); // 맨 앞글자
            if( first == 'E' || first == 'L' ) {
                StringTokenizer st = new StringTokenizer(record[i]);
                st.nextToken();
                sb.append( uid.get(st.nextToken())).append( first == 'E' ? "님이 들어왔습니다.," : "님이 나갔습니다.,");
            }
        }
        
        sb.setLength(sb.length() - 1); // 마지막 , 제거
        
        return sb.toString().split(",");
    }
}

0개의 댓글