코딩 테스트/프로그래머스

프로그래머스 - 오픈채팅방 문제 (자바)

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

 

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

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

programmers.co.kr

아이디를 키, 닉네임을 값으로 map을 만들고

 

들어오고 나가는 경우를 순서대로 배열에 담고

 

들어오는 아이디가 map에 없으면 해당 닉네임으로 map에 등록하고

들어오는 아이디가 map에 있으면 해당 닉네임으로 map을 수정합니다.

(사실 위 두 경우 코드가 동일합니다.)

 

변경하는 경우는 map의 닉네임을 수정해줍니다.

 

저는 들어오고 나가는 경우에 메세지를 출력하는 부분을 전략패턴을 이용했습니다.

Event라는 인터페이스를 만들고 Enter와 Leave가 각각 상속받아서 메세지 출력을 구현한 뒤

배열에 Event를 담고 출력하게 만들었습니다.

이렇게 하지않고 if문으로 분기해서 하셔도 됩니다.

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

interface Event {
    public String getEventMessage(Map<String, String> nickNames);
}

class Enter implements Event {
    private String id;

    public Enter(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    @Override
    public String getEventMessage(Map<String, String> nickNames) {
        String nickname = nickNames.get(id);
        return nickname + "님이 들어왔습니다.";
    }
}

class Leave implements Event {
    String id;

    public Leave(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    @Override
    public String getEventMessage(Map<String, String> nickNames) {
        String nickname = nickNames.get(id);
        return nickname + "님이 나갔습니다.";
    }
}

// 프로그래머스 오픈채팅방 문제
class OpenChat {
    public String[] solution(String[] record) {
        Map<String, String> nickNames = new HashMap<>();
        ArrayList<Event> events = new ArrayList<>();
        for (String s : record) {
            String[] split = s.split(" ");

            if(split[0].equals("Enter")) {
                nickNames.put(split[1], split[2]);
                Event enter = new Enter(split[1]);
                events.add(enter);
            }
            else if(split[0].equals("Leave")) {
                Event leave = new Leave(split[1]);
                events.add(leave);
            }
            else if(split[0].equals("Change")) {
                nickNames.put(split[1], split[2]);
            }
        }
        String[] answer = new String[events.size()];
        for (int i = 0; i< events.size(); i++) {
            answer[i] = events.get(i).getEventMessage(nickNames);
        }
        return answer;
    }
}