https://school.programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
import java.util.*;
class Solution {
public String[] solution(String[] record) {
final String enterMent = "님이 들어왔습니다.";
final String leaveMent = "님이 나갔습니다.";
//결과 문자열들을 담는 resultList
ArrayList<String> resultList = new ArrayList<>();
//<uuid, 닉네임> 을 담는 nickMap
Map<String, String> nickMap = new HashMap<>();
//<uuid, 인덱스> 를 담는 indexMap.
//여기서 '인덱스'는 resultList 에 추가한 문자열 요소들의 인덱스이다.
Map<String, ArrayList<Integer>> indexMap = new HashMap<>();
// indexMap 에 저장할 indexList
for(String order : record){
String[] splOrder = order.split(" ");
if(splOrder[0].equals("Enter")){
// nickMap 에 uuid와 닉네임을 업데이트한다.
nickMap.put(splOrder[1], splOrder[2]);
// Enter 이므로 결과리스트에 "xx님이 들어왔습니다."를 추가한다.
resultList.add(splOrder[2]+enterMent);
// 결과리스트에 추가된 요소의 인덱스를 추가한다.
// 결과리스트는 크기가 줄어드지 않기 때문에 size()-1 을 쓴다.
ArrayList<Integer> indexList = new ArrayList<>();
indexList.add(resultList.size()-1);
if(indexMap.size()==0 || !indexMap.containsKey(splOrder[1])){
indexMap.put(splOrder[1],indexList);
}
else{
indexMap.get(splOrder[1]).add(indexList.get(0));
indexMap.put(splOrder[1],indexMap.get(splOrder[1]));
}
// 결과리스트에 해당 uuid의 모든 닉네임을 업데이트한다.
updateNick(resultList, splOrder[1], indexMap, splOrder[2]);
}else if(splOrder[0].equals("Leave")){
// Leave 이므로 결과리스트에 "xx님이 나갔습니다."를 추가한다.
resultList.add(nickMap.get(splOrder[1])+leaveMent);
// 결과리스트에 추가된 요소의 인덱스를 추가한다.
// 결과리스트는 크기가 줄어드지 않기 때문에 size()-1 을 쓴다.
ArrayList<Integer> indexList = new ArrayList<>();
indexList.add(resultList.size()-1);
indexMap.get(splOrder[1]).add(indexList.get(0));
indexMap.put(splOrder[1],indexMap.get(splOrder[1]));
}else if(splOrder[0].equals("Change")){
// nickMap 에 uuid와 닉네임을 업데이트한다.
nickMap.put(splOrder[1], splOrder[2]);
// 결과리스트에 해당 uuid의 모든 닉네임을 업데이트한다.
updateNick(resultList, splOrder[1], indexMap, splOrder[2]);
}
}
String[] answer = new String[resultList.size()];
for(int i = 0; i<resultList.size(); i++){
answer[i]=resultList.get(i);
}
return answer;
}
static void updateNick(ArrayList<String> resultList, String uuid, Map<String, ArrayList<Integer>> indexMap, String updatedNick){
ArrayList<Integer> indexList = indexMap.get(uuid);
for(int i : indexList){
String old = resultList.get(i);
String[] splOld = old.split("님");
if(splOld[1].equals("이 들어왔습니다.")){
resultList.set(i, updatedNick+"님이 들어왔습니다.");
}else{
resultList.set(i, updatedNick+"님이 나갔습니다.");
}
}
}
}
- uuid 와 닉네임을 담는 HashMap 인 nickMap
- uuid 와 resultList에서 해당 uuid와 관련된 결과문자열의 인덱스들이 담긴 indexMap
- 결과문자열을 담는 ArrayList인 resultList
nickMap 을 통해 uuid 의 닉네임을 최신 상태를 유지한다.
Enter, Leave 요청일 때 resultList 에 결과문자열을 추가하고 해당 인덱스를 indexMap 에서 관리한다.
Enter, Change 요청일 경우, nickMap 에서 닉네임이 업데이트되고 그 때마다 resultList 에서 해당되는 결과문자열을 updateNick() 메소드를 통해 업데이트한다.
또 최초에 로직을 잘못 짜서 실패하고.. 다시 풀었다.
어떤 자료구조를 사용해서 어떻게 구성할 지가 가장 고민이었다.
시간은 3시간 정도 걸렸다 ㅠㅠ
'알고리즘 > 문제' 카테고리의 다른 글
| *[프로그래머스] lv2 땅따먹기 / Java (0) | 2023.05.11 |
|---|---|
| *[프로그래머스] lv2 주식가격 /java (0) | 2023.05.09 |
| [프로그래머스] lv2 주차요금계산 / java (0) | 2023.05.02 |
| [프로그래머스] lv2 전화번호 목록 / java (0) | 2023.04.06 |
| *[프로그래머스] Lv2 k진수에서 소수 개수 구하기 / Java (0) | 2023.03.27 |
