프로그래머스

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

킴준현 2025. 2. 12. 16:47

📝 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42888?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

🔑 풀이

  class Solution {
        public String[] solution(String[] record) {
            HashMap<String, String> nickname = new HashMap<>();
            HashMap<String, String> msg = new HashMap<>();
            msg.put("Enter", "님이 들어왔습니다.");
            msg.put("Leave", "님이 나갔습니다.");

            for (String s : record) {
                String[] split = s.split(" "); // 띄워쓰기 기준 split
                
                // Enter, Change 일 때만 아이디를 해시맵의 key 값으로, 닉네임은 value 값으로 활용
            	// 아이디가 겹치면 최종 닉네임을 덮어쓴다 -> HashMap 활용
                if (split.length == 3) {
                    nickname.put(split[1], split[2]); // key, value
                }
            }

            ArrayList<String> answer = new ArrayList<>();

            for (String s : record) {
                String[] split = s.split(" ");
                if (msg.containsKey(split[0])) {
                    answer.add(nickname.get(split[1]) + msg.get(split[0]));
                }

            }

            return answer.toArray(new String[0]);
        }
    }

 

[설명]

유저 아이디 별로, 가장 마지막 닉네임으로 채팅방 메세지 변환

 

[접근 방법]

1. 유저아이디 별로, 가장 마지막 닉네임을 HashMap에 저장

2. HashMap에 저장한 닉네임을 꺼내서 메시지를 만든다.

3. ArrayList에 메시지를 저장한다.

4. ArrayList를 배열로 변환한다.

 

[유의 사항]

어느 아이디를 가지고 있던 사람의 마지막 닉네임이 무엇인지가 제일 중요하다.

그 전에 어떤 닉네임을 사용했는지는 안 중요하다.

기존에 닉네임이 마지막에 다 바뀌기 때문이다.

Enter, Change 일 때만 아이디를 해시맵의 key 값으로, 닉네임은 value 값으로 활용
아이디가 겹치면 최종 닉네임을 덮어쓴다 -> HashMap 활용

📌 [TIL]

new String[0]을 사용하는 이유는 Java에서 ArrayList를 배열로 변환할 때, 반환되는 배열의 타입을 명시하기 위해서.

toArray 메서드는 ArrayList의 요소를 배열로 변환하는데, 이 메서드는 두 가지 형태로 오버로딩되어 있다.

toArray(): 매개변수를 받지 않고, Object[] 타입의 배열을 반환한다.
toArray(T[] a): 매개변수로 전달된 배열의 타입에 맞춰서 배열을 반환한다. 만약 전달된 배열의 크기가 ArrayList의 크기보다 작으면, 새로운 배열이 생성되어 반환된다.


new String[0]을 전달하는 것은 다음과 같은 이유로 사용된다.

  • 타입 안전성: new String[0]을 사용하면 반환되는 배열의 타입이 String[]로 보장된다. 이는 타입 캐스팅을 피할 수 있게 해준다.
  • 배열 크기: new String[0]은 크기가 0인 배열을 생성한다.
    이 배열은 ArrayList의 크기에 맞춰서 새로운 배열이 생성될 수 있도록 한다.
    즉, ArrayList의 요소가 0개일 경우, 빈 배열이 반환되고, 요소가 있을 경우 그 크기에 맞는 배열이 반환된다.

    예를 들어, answer.toArray(new String[0])를 호출하면, answer에 있는 요소의 수에 따라 적절한 크기의 String 배열이 생성되어 반환된다. 만약 answer가 비어 있다면, 빈 String 배열이 반환된다.

    이러한 방식은 Java에서 배열을 다룰 때 일반적으로 사용되는 패턴이다.