[구현] 프로그래머스 오픈채팅(실패분석-시간초과)

byeol·2023년 4월 17일
0

접근

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

이 문제는 너무 복잡하게 접근해서 시간초과가 발생했습니다.

제가 처음 접근했던 방법은 아래와 같습니다.

하나의 ArrayList에
내부 클래스 Tag를 저장했습니다.

class tatic Tag{
   String uid;
   String nick;
   String tall;
   public Tag(String uid, String nick, String tall){
      this.uid=uid;
      this.nick=nick;
      this.tall = tall;
   }
}
ArrayList<Tag> list = new ArrayList<>();

또한 Map을 이용해서 uid를 key로 nickname를 value로 하는 것을 선언했습니다.
그렇게 해서 nickname이 바뀌거나 추가되는 경우는 map을 이용했습니다.

그러나 위 방법의 문제는
list에서 uid와 맞는 값을 찾는 과정에서 시간초과가 발생합니다.

저는 for문을 이용해서 값을 찾았습니다.
만약 새로 들어온 uid인지 아닌지 확인하는 과정에서
list 전체를 for문을 통해서 검색해야 했습니다.

그래서 다른 분의 풀이에 힌트를 얻어서 다시 풀어보았습니다.
여기서 핵심은
uidlist와 talklist는 같이 진행된다는 것
그리고 그 uidlist에 맞는 nickname을 Map에서 찾아서 넣어주면 되는 것입니다.

따라서 풀이는 아래와 같습니다.

풀이

import java.util.*;

class Solution {
   
  
    public ArrayList<String> solution(String[] record) {
         //talk부분만 저장하는 list
         ArrayList<String> talklist = new ArrayList<>();
         //uid 부분만 저장하는 list
         ArrayList<String> uidlist = new ArrayList<>();
    
        //key-uid : value-nickname
        Map<String, String> map = new HashMap<>();
        
        for(String r : record){
            String[] R = r.split(" ");
            
            
            if(R[0].equals("Enter")){
                     talklist.add("님이 들어왔습니다.");
                     uidlist.add(R[1]);
                     map.put(R[1],R[2]);
                
            }else if(R[0].equals("Leave")){
                      talklist.add("님이 나갔습니다.");
                      uidlist.add(R[1]);
                  
            }else {
                 map.put(R[1],R[2]);
            }       
        }
        
        ArrayList<String> answer = new ArrayList<>();
        
        
        for(int i=0;i<talklist.size();i++){
            String sub = map.get(uidlist.get(i))+talklist.get(i);
            answer.add(sub);
        }
                
        return answer;
    }
        
}
profile
꾸준하게 Ready, Set, Go!

0개의 댓글