코딩/알고리즘

[알고리즘] 프로그래머스 오픈채팅방 Java(자바)

유어노우 2022. 1. 5. 23:51

- 문제

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

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

- 코드 설명

record의 최대 길이가 100000(10만)이나 되기때문에 하나하나 다시 바꾸는것은 시간이 많이 걸린다고 생각하여 해시맵을 사용해야 된다고 생각했습니다.

 

Enter와 Leave일 경우만 answer에 표시되기 때문에 해당 메세지의 상태(Enter or Leave) 와 uid 만 result에 넣어줍니다.

HashMap<uid, username> 이라고 생각하고 Enter와 Change일때만 넣어줍니다.

 

마지막엔 answer의 크기인 result에 크기만큼 배열을 지정해주고

 

while문을 통해 정답을 추출합니다. 

import java.util.*;


class Solution {
    public String[] solution(String[] record) {
        String[] answer = {};
        HashMap<String,String> user = new HashMap<>();
        Queue<Result> result = new LinkedList<>();

        for(String msg : record){
            String []str = msg.split(" ");
            if(str[0].equals("Enter")){
                user.put(str[1],str[2]);
                result.offer(new Result(str[0],str[1]));
            }else if(str[0].equals("Leave")){
                result.offer(new Result(str[0],str[1]));
            }
            else{
                user.put(str[1],str[2]);
            }
        }

        answer = new String[result.size()];

        for(int i=0; !result.isEmpty() ; i++){
            Result rs = result.poll(); 

            if(rs.state.equals("Enter"))
                answer[i] = new String(user.get(rs.uid) +"님이 들어왔습니다.");
            else
                answer[i] = new String(user.get(rs.uid) +"님이 나갔습니다.");
        }
        return answer;
    }
}

class Result{
    String uid;
    String state;

    public Result(String state, String uid){
        this.uid = uid;
        this.state = state;
    }
}

- 결과