본문 바로가기
알고리즘 문제 풀이/프로그래머스

2019 KAKAO BLIND RECRUITMENT 오픈채팅방

by 성건희 2022. 7. 7.
반응형

본 풀이는 java 언어를 사용하였습니다.
문제 보러가기

풀이

잘 생각해보면 유저의 아이디는 변하지 않고, 변하는 건 유저의 닉네임이다.
따라서 유저의 아이디 닉네임을 HashMap 으로 저장해놓고,
결과를 출력하기 전에 모든 record 를 순회하면서 HashMap 에 있는 유저의 닉네임으로 변경시켜준 후 결과를 출력하면 쉽게 풀수있다.


먼저 아이디, 닉네임을 저장 할 HashMap 을 하나 만들어준다.
Map<String, String> userIds = new HashMap<>();

그 후 record 를 순회하면서 값을 체크해주는데,
Leave 의 경우 2 단어 (행동, 아이디) 로 들어오기 때문에 닉네임을 임의로 빈 값으로 지정한다.

for (String userInfo : record) {
    StringTokenizer st = new StringTokenizer(userInfo, " ");
    String behavior = st.nextToken();
    String userId = st.nextToken();
    String nickname;
    if (behavior.equals(LEAVE)) {
        nickname = "";
    } else {
        nickname = st.nextToken();
        userIds.put(userId, nickname);
    }
    if (behavior.equals(CHANGE)) {
        userIds.put(userId, nickname);
        continue;
    }
    users.add(new User(behavior, userId, nickname));
}

HashMap 으로 저장되는건 Enter, Change 의 경우이기 때문에 위와같이 처리했다.
추가로 유저의 정보는 User 클래스로 만들어서 코드를 이해하기 쉽도록 하였다.

class User {

    private final String behavior;
    private final String userId;
    private String nickname;

    public User(String behavior, String userId, String nickname) {
        this.behavior = behavior;
        this.userId = userId;
        this.nickname = nickname;
    }

    public void updateNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getBehavior() {
        return behavior;
    }

    public String getUserId() {
        return userId;
    }

    public String getNickname() {
        return nickname;
    }
}

그 다음은 간단하다.
HashMap 에 저장되어있는 닉네임이 변경된 최종의 닉네임이므로 user 를 순회하면서 변경된 닉네임으로 update 처리하면 된다.

for (User user : users) {
    user.updateNickname(userIds.get(user.getUserId()));
}

마지막으로 출력 양식에 맞게 결과 값을 넣어주면 끝이다.

List<String> result = new ArrayList<>();
for (User user : users) {
    if (user.getBehavior().equals(ENTER)) {
        result.add(user.getNickname() + "님이 들어왔습니다.");
        continue;
    }
    if (user.getBehavior().equals(LEAVE)) {
        result.add(user.getNickname() + "님이 나갔습니다.");
    }
}

코드

import java.util.*;

public class Solution {

    private static final String ENTER = "Enter";
    private static final String LEAVE = "Leave";
    private static final String CHANGE = "Change";

    public String[] solution(String[] record) {
        List<User> users = new ArrayList<>();
        Map<String, String> userIds = new HashMap<>();

        for (String userInfo : record) {
            StringTokenizer st = new StringTokenizer(userInfo, " ");
            String behavior = st.nextToken();
            String userId = st.nextToken();
            String nickname;
            if (behavior.equals(LEAVE)) {
                nickname = "";
            } else {
                nickname = st.nextToken();
                userIds.put(userId, nickname);
            }
            if (behavior.equals(CHANGE)) {
                userIds.put(userId, nickname);
                continue;
            }
            users.add(new User(behavior, userId, nickname));
        }

        for (User user : users) {
            user.updateNickname(userIds.get(user.getUserId()));
        }

        List<String> result = new ArrayList<>();
        for (User user : users) {
            if (user.getBehavior().equals(ENTER)) {
                result.add(user.getNickname() + "님이 들어왔습니다.");
                continue;
            }
            if (user.getBehavior().equals(LEAVE)) {
                result.add(user.getNickname() + "님이 나갔습니다.");
            }
        }

        return result.toArray(new String[0]);
    }
}

class User {

    private final String behavior;
    private final String userId;
    private String nickname;

    public User(String behavior, String userId, String nickname) {
        this.behavior = behavior;
        this.userId = userId;
        this.nickname = nickname;
    }

    public void updateNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getBehavior() {
        return behavior;
    }

    public String getUserId() {
        return userId;
    }

    public String getNickname() {
        return nickname;
    }
}

회고

HashMap 을 생각해서 풀었더니 생각보다 너무 쉽게 문제가 풀려서 기분이 좋았다.
카카오 문제 별거 없구나ㅎ_ㅎ

반응형

댓글