[프로그래머스] 오픈채팅방 - Java, 자바

난이도

레벨 2

문제

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

풀이

  1. 출력형태를 보니 유저가 들어왔을 때와 나갔을 때 출력한다.
    큐를 이용해서 어떤 아이디가 들어오고 나갔는지 저장한다.
    q.add("Enter"(or "Leave"), ID);

  2. 아이디에 해당하는 닉네임을 갱신 시켜줘야한다.
    아이디가 들어올 때 map에 put해주고 변경을 요청할 때 replace(put)해준다.

  3. Queue에서 ID를 빼어 닉네임을 가져오고, Enter인 경우 "님이 들어왔습니다." Leave 인 경우 "님이 나갔습니다."

++ 추가

다른 사람들 풀이도 한번 둘러봤다.

  1. 기록을 남길 result 리스트 생성

  2. record를 반복문 돌리며
    Enter 인 경우 map.put(id, nickname); , result.add(id + "님이 들어왔습니다.");
    Leave 인 경우 result.add(id+"님이 나갔습니다.);
    Change 인 경우 map.put(id, nicknmae);// 닉네임 변경

  3. result를 반복문 돌리며

    1. '님'자의 인덱스를 뽑아와서 id를 구한다.
      int idx = result.get(i).indexOf("님");
      String id = result.get(i).substring(0, idx);

    2. 맵으로 id를 nickname으로 가져오고 그 뒤에 "님" 이후 문자열을 붙인다.
      map.get(id) + result.get(i).substring(idx);

코드

1) 내 풀이



import java.util.*;

public class 오픈채팅방 {
    public String[] solution(String[] record) {


        Queue<String[]> q = new LinkedList<>();
        HashMap<String, String> map = new HashMap<>();

        for (int i = 0; i < record.length; i++) {
            String[] str = record[i].split(" ");

            if (!str[0].equals("Change")) {
                q.add(new String[]{str[0], str[1]});
            }

            if (str[0].equals("Change")) {
                map.replace(str[1], str[2]);
                // map.put(str[1],str[2]);
            }

            if (str[0].equals("Enter")) {
                map.put(str[1], str[2]);
            }

        }

        String[] answer = new String[q.size()];
        int i = 0;
        while (!q.isEmpty()) {
            String[] str = q.poll();

            if (str[0].equals("Enter")) {
                answer[i++] = map.get(str[1]) + "님이 들어왔습니다.";
            } else {
                answer[i++] = map.get(str[1]) + "님이 나갔습니다.";
            }
        }


        return answer;
    }
}

2) 다른 풀이

package 레벨2;

import java.util.*;

public class 오픈채팅방 {

    public String[] solution(String[] record) {

        // 기록을 남길 list
        List<String> result = new ArrayList<>();

        // <id, nickname>
        HashMap<String, String> map = new HashMap<>();

        for (int i = 0; i < record.length; i++) {
            String[] str = record[i].split(" ");

            if (str[0].equals("Enter")) {
                map.put(str[1], str[2]);
                result.add(str[1] + "님이 들어왔습니다.");
            }

            if (str[0].equals("Leave")) {
                result.add(str[1] + "님이 나갔습니다.");
            }


            if (str[0].equals("Change")) {
                map.put(str[1], str[2]); // 변경
            }

        }

        String[] answer = new String[result.size()];
        for (int i = 0; i < result.size(); i++) {
            // id만 빼오기 위해 0부터 indexOf("님")까지 substring
            int idx = result.get(i).indexOf("님");
            String id = result.get(i).substring(0, idx);
            answer[i] = map.get(id) + result.get(i).substring(idx);
        }

        return answer;
    }
}

https://taehoung0102.tistory.com/60

좋은 웹페이지 즐겨찾기