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

개츠비·2023년 3월 3일
0

프로그래머스

목록 보기
4/16
post-custom-banner

소요시간

30분.
문제 이해하는데 5분 ,
전체적으로 푸는데 20분
예외처리 5분

사용한 알고리즘

해시맵.
사용자의 id를 key로,
닉네임을 value 로 가지고 있어야 한다.

시간복잡도는 record 배열의 길이를 n이라고 하면
O(n) 이 걸릴 것으로 에상했다.

문제 해결 과정

우선 이 문제는 마지막으로 입장한 , 혹은 변경한 닉네임이 value로 있어야 한다. 처음의 for문에서 사용자가 입장, 혹은 닉네임을 변경할 때마다 해시맵의 value를 바꿔주었다. 이 작업이 o(n) 이 걸렸고,
두 번째로 결국 마지막으로 저장된 해시맵의 value 로 사람이 들어왔을 떄, 혹은 나갔을 때 return해야할 문자열을 저장해주면 됐다. 이 작업이 o(n) 이 걸렸다.

o(n) + o(n) = o(n) .

풀이 과정

  1. 첫 for문으로 해시맵의 value 를 계속해서 갱신한다. 이 때 n3를 외부 변수로 선언한 이유는 leave는 split 했을 때 length 가 2이다. 그래서 line[2] 의 인덱스에 접근하려고 하면 에러가 발생. 따라서 길이가 2 초과라면 이 경우도 고려하도록 했다.
  2. enter 나 leave 를 하는 횟수가 우리가 나중에 return 해줘야 할 배열의 크기이다. 그래서 그때마다 cnt 를 증가시켜주고, 첫 for문이 끝났을 떄 그 크기만큼 배열의 길이를 정한다.
  3. 마지막으로 우리가 최종적으로 수정된 닉네임이 해시맵에 저장되어 있을 것이다. enter 혹은 leave 일 때 그 문장을 출력해주면 된다.

소스코드

import java.util.*;
class Solution {
    public String[] solution(String[] record) {
        HashMap<String,String> map=new HashMap<>();
        int cnt=0;
        String enter="님이 들어왔습니다.";
        String leave="님이 나갔습니다.";
        
        String n3="";
        for(int i=0;i<record.length;i++){
            String line[]=record[i].split(" ");
            String n1=line[0];
            String n2=line[1];
            if(line.length>2)
               n3=line[2];
            if(n1.equals("Enter")){
                map.put(n2,n3);
                cnt++;
            }
            if(n1.equals("Change")){
                map.put(n2,n3);
            }
            if(n1.equals("Leave")){
                cnt++;
            }
        }
        String arr[]=new String[cnt];
        int index=0;
       
        for(int i=0;i<record.length;i++){
            String line[]=record[i].split(" ");
            String n1=line[0];
            String n2=line[1];
            if(line.length>2)
              n3=line[2];
            String name=map.get(n2);
            if(n1.equals("Enter")){
                arr[index++]=name+enter;
            }
            else if(n1.equals("Leave")){
                 arr[index++]=name+leave;
            }
            
        }
        return arr;
    }
}

회고

문제 자체가 굉장히 쉬웠다. 큰 어려움 없이 문제를 풀었으나 split 했을 때 배열의 길이가 다른 경우에 대해서 왜 이런 오류가 발생했는지 5분이나 고민한 것이 그렇게 좋다고만은 할 수 없는 것 같다. 내일은 소프트웨어 마에스트로 2차 코딩테스트다. 붙을 수 있으려나 ?

하루에 백준 1문제 이상 푸는 것을 목표로 하고 있습니다.
https://solved.ac/profile/anwlro0212

profile
아이스 카라멜 마끼아또보단 뜨거운 아메리카노를, 맨투맨보단 니트를, 웹툰보단 책을 좋아하고 싶은 사람
post-custom-banner

0개의 댓글