본문 바로가기
Algorithm/Programmers Java

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

by 제우제우 2024. 10. 10.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코딩테스트 연습 > 2019 KAKAO BLIND RECRUITMENT > 오픈채팅방

 

난이도: LEVEL2

알고리즘 유형: 구현 

문제 분석 

Map<String, String> key: uuid value: 제일 최근 닉네임 

map 자료구조에 record 배열을 순차적으로 순회하면서 해당 uuid의 닉네임을 제일 최근 닉네임으로 갱신한다. 

그리고 반환 String 배열에는 IN/OUT을 출력해야 하니까 Change가 아니면 카운트해준다. (cnt 변수)

 

그리고 다시 record 배열을 순차적으로 순회하면서 

IN/OUT이면 출력을 해준다. 이때 출력은 map으로 가져와서 최신 닉네임으로 해준다. 

 

record 배열 길이가 최대 10,0000이고 내 풀이는 겨우 2번 순회하니까 시간 초과는 발생할 일 없을 거라 예상했다.  

정답 코드 

import java.util.*;
import java.util.stream.*;
class Solution {
    static final String IN_SUFFIX  = "님이 들어왔습니다.";
    static final String OUT_SUFFIX = "님이 나갔습니다.";
    static HashMap<String, String> map = new HashMap<>();
    public String[] solution(String[] record) {
        int cnt = 0;
        for(String next : record){
            String [] split = next.split(" ");
            // 갱신 or 생성 
            if(split[0].equals("Enter") || split[0].equals("Change")){
                map.put(split[1], split[2]);    
            }
            if(split[0].equals("Enter") || split[0].equals("Leave")) cnt++;
        }
        String [] answer = new String [cnt];
        
        int index = 0;
        for(int i = 0; i < record.length; i++){
            String [] split = record[i].split(" ");
            if(split[0].equals("Change")) continue;
            if(split[0].equals("Enter")){
                answer[index++] = map.get(split[1]) + IN_SUFFIX;
            }
            else answer[index++] = map.get(split[1]) + OUT_SUFFIX;
        }
        return answer;
    }
}