본문 바로가기
PS/프로그래머스

[프로그래머스 *Java] - 오픈채팅방

by Jman 2022. 5. 12.

오픈채팅방

 

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

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

programmers.co.kr


👇 접근방식

처음에는 고민을 많이했던 문제였습니다.
고민을 하다 앞으로 이런 문제를 풀 때 규칙을 갖고 문제에 접근하면 좋을 거 같다 생각했습니다.
일단 return 값을 출력할 때, change 된 닉네임은 change가 되어있는 상태에서 return 이 되어야합니다.
고로 해당 id에 바뀌던, 바뀌지않던, 최종 nickname 을 알고 있어야 한다는 점입니다.
그리고 출력할 땐, 순서를 기억해서 들어왔고 나갔고를 출력해줘야 합니다.
이 부분은 입력 받은 값을 가지고 루프를 돌면서 HashMap을 이용해서 key:id, value:nickname 을 저장한 곳에 접근해서 해당 키의 벨류 값을 뽑아서 문자열 조합을 한 뒤 출력을 해주면 되는 문제였습니다.

이런 식으로 생각해서 정리하면 로직설계가 금방되는 문제였습니다.
다시 정리하자면,
1. 입력 받은 record를 가지고 Enter, Change일 경우, 루프 안으로 들어와, HashMap에 값을 저장하고 수정(덮어씌우기)를 거칩니다.
2. 이제 값을 출력하려고 하는데, 똑같이 입력 받은 값을 가지고, 루프를 돌면서, Enter와 Leave일 경우에 나눠서 출력하는데, Enter는 HashMap에 접근해서 nickname 을 가져옵니다. Leave는 그냥 문자열 조합해서 출력하면 됩니다.

 

아래는 성공한 코드입니다.

import java.util.ArrayList;
import java.util.HashMap;

class Solution {
    public static String[] solution(String[] record) {
        ArrayList<String> arrayList = new ArrayList<>();
        HashMap<String, String> hashMap = new HashMap<>();

        // 닉네임 저장
        for (int i = 0; i < record.length; i++) {
            String[] input = record[i].split(" ");
            if (!input[0].equals("Leave")) {
                hashMap.put(input[1], input[2]);
            }
        }
        
        // result 처리
        for (int i = 0; i < record.length; i++) {
            String[] input = record[i].split(" ");
            
            if (input[0].equals("Enter")) {
                String ans = hashMap.get(input[1]) + "님이 들어왔습니다.";
                arrayList.add(ans);
            }

            if (input[0].equals("Leave")) {
                String ans = hashMap.get(input[1]) + "님이 나갔습니다.";
                arrayList.add(ans);
            }
        }

        String[] answer = new String[arrayList.size()];
        answer = arrayList.toArray(answer);
     
        return answer;
    }
}