devFancy BE Developer

[Programmers] 42888. 오픈채팅방

2023-03-26
devFancy

문제 링크

성능 요약

  • 메모리: 155 MB, 시간: 105.47 ms

구분

  • 코딩테스트 연습 > 2019 KAKAO BLIND RECRUITMENT

Answer Code1(23.03.26)

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        Map<String, String> idMap = new HashMap<>(); // (아이디 - 닉네임) Map
        int count = 0; // Change할 때마다 +1 증가
        
        for(int i = 0; i < record.length; i++) {
            String [] info = record[i].split(" ");
            
            if(info[0].equals("Leave")) {
                continue;
            } else if(info[0].equals("Enter")) {
                idMap.put(info[1], info[2]);
            } else {
                idMap.put(info[1], info[2]);
                count++;
            }
        }
        
        String[] answer = new String[record.length - count];
        int idx = 0;
        
        for(int i = 0; i < record.length; i++) {
            String [] info = record[i].split(" ");
            String nickname = idMap.get(info[1]);
            
            if(info[0].equals("Enter")) {
                answer[idx++] = nickname + "님이 들어왔습니다.";
            } else if(info[0].equals("Leave")) {
                answer[idx++] = nickname + "님이 나갔습니다.";
            }
        }
        
        return answer;
    }
}

문제 풀이 - Answer Code1

  • 아이디와 닉네임을 Map을 선언하여 idMap이라는 변수에 저장하고, 닉네임을 변경할 때마다 메시지에서 제외할 count를 증가하는 메서드를 구현한다.
Map<String, String> idMap = new HashMap<>(); // (아이디 - 닉네임) Map
int count = 0; // Change할 때마다 +1 증가

for(int i = 0; i < record.length; i++) {
    String [] info = record[i].split(" ");
    
    if(info[0].equals("Leave")) {
        continue;
    } else if(info[0].equals("Enter")) {
        idMap.put(info[1], info[2]);
    } else {
        idMap.put(info[1], info[2]);
        count++;
    }
}
  • 닉네임에 대한 탐색을 마치고 나서 return하기 위해 메시지에 담을 배열인 answer 선언한다.

  • 여기서 닉네임 변경한 것에 대해 채팅방 메시지에 표시되지 않으므로 메시지에서 제외할 count 만큼의 크기로 초기화한다.

  • 배열의 인덱스를 지정할 변수 idx도 선언한다.

String[] answer = new String[record.length - count];
int idx = 0;
  • 각 값을 공백을 기준으로 split하고, 들어오고 나가는 경우에 대해서만 메시지를 작성하여 저장한다.

  • 닉네임은 아이디를 key를 이용하여 idMap에서 value를 가져와서 사용한다.

for(int i = 0; i < record.length; i++) {
    String [] info = record[i].split(" ");
    String nickname = idMap.get(info[1]);
    
    if(info[0].equals("Enter")) {
        answer[idx++] = nickname + "님이 들어왔습니다.";
    } else if(info[0].equals("Leave")) {
        answer[idx++] = nickname + "님이 나갔습니다.";
    }
}

Review

  • HashMap의 개념과 문제를 제대로 이해한다면 충분히 풀 수 있는 문제였다.

  • 해당 문제를 풀면서, HashMap의 개념을 제대로 깊이 이해할 필요가 생겼다는 계기가 되었다.

Reference


Comments

Index