오픈채팅방 뜯어먹기

프로그래머스 42888. 오픈채팅방

오픈채팅방 문제를 풀면서 얻어갈 수 있는 것들이 무엇이 있는지 살펴보고 뜯어먹어보자.

얻어 가야 하는 것

  • 자료구조 HashMap
    • 특정 값을 찾기 위해 저장된 데이터를 모두 순회하기에는 데이터가 너무 많을 경우에 Map을 사용할 수 있다.
      (모두 순회하면 O(N), HashMap 조회는 일반적으로 O(1))
    • Key는 하나만 존재할 수 있다.
      (즉, 값을 넣을 때 동일한 키가 존재한다면 value만 변경된다.)
  • List를 Array로 바꾸기
    • Java8에서는 stream을 활용해 간단히 변환할 수 있다.
      arrayList.stream().toArray(array -> new String[arrayList.size()]);
      이런 식으로 활용한다.
List<String> arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("b");

String[] result1 = new String[arrayList.size()];
for(int i=0; i<arrayList.size(); i++) {
    result1[i] = arrayList.get(i);
}

String[] result2 = arrayList.stream().toArray(array -> new String[arrayList.size()]);

if (Arrays.equals(result1, result2)) {
    System.out.println("true"); //출력된다.
}

프로그래머스 42888 문제 링크 및 핵심 아이디어

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

  • HashMap을 사용해서 유저를 식별하는 id값과 닉네임을 매칭하여 각 유저의 현재 닉네임을 추적할 수 있는 자료구조를 만든다.
  • 입력으로 주어진 record를 실행하고 나서 마지막으로 매칭된 각 id의 닉네임을 사용해 정답을 출력해줄 수 있다.

풀이

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        Map<String,String> idMap = new HashMap<>();

        for(String cmd : record) {
            String[] splitCmd = cmd.split(" ");
            if(splitCmd[0].equals("Enter") || splitCmd[0].equals("Change")) {
                idMap.put(splitCmd[1], splitCmd[2]);
            }
        }
        
        List<String> answerList = new ArrayList<>();
        for(String cmd : record) {
            String[] splitCmd = cmd.split(" ");
            if(splitCmd[0].equals("Enter")) {
                answerList.add(idMap.get(splitCmd[1])+"님이 들어왔습니다.");
            }
            if(splitCmd[0].equals("Leave")) {
                answerList.add(idMap.get(splitCmd[1])+"님이 나갔습니다.");
            }
        }
        
        return answerList.stream().toArray(array -> new String[answerList.size()]);
    }
    
}
스스로 경험하며 얻은 깨달음을 공유하기 좋아하며, 세상이 필요로 하는 코드를 작성하기 위해 노력하는 개발자입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다