구리

[Algorithm] 프로그래머스 - 오픈채팅방 (Java) 본문

혼자 공부,정리하는 알고리즘

[Algorithm] 프로그래머스 - 오픈채팅방 (Java)

guriguriguri 2021. 10. 26. 12:14

[문제]

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

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

[풀이]

문제를 봤을 때 일단 2가지가 필요하다고 생각했다.

 

  • id는 고정적이나 닉네임은 변경 가능성이 있기에 key값 중복허용이 불가한 Map을 이용하여 id,닉네임 저장하기
  • 채팅방 입장/퇴장 기록을 저장하는데 몇명이 얼마나 들어왔다 나갈지 모르지 길이가 고정적인 배열이 아닌 List 생성 (입장,퇴장 & id 저장)

그리고 닉네임이 변경될 수 있는 경우는 유저가 새로운 닉네임 변경 후 재입장할 경우, 채팅방 내에서 변경할 경우이므로 Enter, Change 로 시작되는 문자열일때 무조건 map에 id,닉네임을 저장한다.

 

1. 모든 기록이 담긴 record를 for문으로 돌기

  • 꺼낸 문자열 str을 공백(" ")으로 쪼개서(split) 입장/퇴장을 표시하는 act, 유저 아이디를 뜻하는 id, 유저 닉네임를 가르키는 name 선언
  • 만약 입장일 경우 List에 채팅방 입장/퇴장, id를 저장, map에 id, name 저장
  • 퇴장일 경우 List에 채팅장 입장/퇴장, id 저장
  • 닉네임 변경일경우 Map에만 id, name 저장

2. record for문이 끝났다면 List를 for문으로 돌면서 Map.get(id)로 value값인 닉네임과 입장/퇴장에 따른 기록 출력

 

[코드]

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
    public String[] solution(String[] record) {
        String[] answer = {};
        // id, 닉네임을 저장하는 변수
        Map<String, String> map = new HashMap<>();

        // id, 입장/퇴장 기록하는 변수 (String[0] = id, String[1] = 입장/퇴장
        List<String[]> list = new ArrayList<>();

        for(String str : record){
            String act = str.split(" ")[0]; // 입장/퇴장
            String id = str.split(" ")[1];  // 사용자 id

            if(act.equals("Enter")){    // 채팅방 입장할 경우
                String name = str.split(" ")[2];    // 닉네임 추출
                map.put(id, name);
                list.add(new String[]{id,"님이 들어왔습니다."});
            }else if(act.equals("Change")){ // 닉네임 변경일경우
                String name = str.split(" ")[2];
                map.put(id, name);
            }else{  // 채팅방 퇴장하는 경우
                list.add(new String[]{id,"님이 나갔습니다."});
            }
        }
        
        answer = new String[list.size()];

        for(int i=0;i<list.size();i++){
            answer[i] = map.get(list.get(i)[0]) + list.get(i)[1];
        }
        return answer;
    }
}