programmers.co.kr/learn/courses/30/lessons/42888
아이디를 키, 닉네임을 값으로 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;
}
}
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 멀리 뛰기 문제 (자바) (0) | 2021.03.27 |
---|---|
프로그래머스 - 거스름돈 문제 (자바) (0) | 2021.03.27 |
프로그래머스 - 기지국 설치 문제 (자바) (0) | 2021.03.27 |
프로그래머스 - 광고 삽입 문제 (자바) (0) | 2021.03.25 |
프로그래머스 - 순위 검색 문제 (자바) (0) | 2021.03.24 |