코딩테스트/프로그래머스
[Java] 프로그래머스 Level 2 : 오픈채팅방
이덩우
2023. 6. 30. 11:47
- 문제설명
- 예시
- 해결과정
- 닉네임이 변경되는 상황은 나갔다 들어오는 경우 or 직접 닉네임을 바꾸는 경우, 총 두 가지다.
- 문제에서 원하는 답은, 닉네임 변경사항을 끝까지 추적해서 최종 닉네임을 포함한 문장을 출력하라는 문제이다.
- 첫 번째로 <고유Id, 닉네임> 형식의 HashMap을 생성해, 닉네임의 변동이 생길 때마다 업데이트 해줬다.
- 정답으로 내보내야 하는 것은 오픈채팅방에 들어올 때, 나갈 때만 어떤 사람이었는지 알려주면된다.
- 닉네임 변경사항은 표시안해줘도 된다.
- 따라서 리스트에 [출입상태, 고유Id] 형식으로 출입 명령이 들어올 때마다 기록해줬다.
- 이후 정답에서 원하는 형식에 따라 문장을 출력해주면 되는데, 리스트에 있는 고유Id를 key값으로 해시맵을 통해 최종 닉네임을 얻어와서 정답을 반환해주면 된다.
- 솔루션
import java.util.*;
class Solution {
public String[] solution(String[] record) {
HashMap<String, String> memberTable = new HashMap<>();
ArrayList<String[]> accessList = new ArrayList<>();
for(String a : record) changeRecord(a, memberTable, accessList);
String[] answer = new String[accessList.size()];
makeAnswer(answer, memberTable, accessList);
return answer;
}
private void changeRecord(String record, HashMap<String, String> memberTable, ArrayList<String[]> accessList) {
String[] input = record.split(" ");
if(input[0].equals("Enter")) {
memberTable.put(input[1], input[2]);
accessList.add(new String[]{"Enter", input[1]});
}
if(input[0].equals("Leave")) {
accessList.add(new String[]{"Leave", input[1]});
}
if(input[0].equals("Change")) {
memberTable.put(input[1], input[2]);
}
}
private void makeAnswer(String[] answer, HashMap<String, String> memberTable, ArrayList<String[]> accessList) {
for(int i = 0; i < accessList.size(); i++) {
if(accessList.get(i)[0].equals("Enter")) {
answer[i] = memberTable.get(accessList.get(i)[1]) + "님이 들어왔습니다.";
}
if(accessList.get(i)[0].equals("Leave")) {
answer[i] = memberTable.get(accessList.get(i)[1]) + "님이 나갔습니다.";
}
}
}
}
- 정리
- 카카오 문제 재밌다!