문제의 핵심은 "마지막에 바꾼 닉네임이 진짜 닉네임" 이라는 것이다.
만약 record의 리스트가 아래처럼 주어졌다고 가정하자.
ex) record
["Enter id1 A","Enter id2 B","Leave A","Enter id1 B", "Change id2 C"]
그리고 비어있는 HashMap<String,String> 초기화 한다. 이유는 고유한 아이디마다 하나의 닉네임을 결국에 가지게 될것이기 때문이다.
뒤에서 부터 아이디가 HashMap에 있는지 검색하고 없으면 추가한다.
record 의 크기가 5이므로 뒤에서 부터 총 5번의 과정에서 HashMap이 어떻게 변화하는지 보자.
1) { "id2":"C" }
2) {"id1":"B","id2":"C"}
3) {"id1":"B","id2":"C"}
4) {"id1":"B","id2":"C"}
5) {"id1":"B","id2":"C"}
결국 "id1"의 닉네임은 "B" 이며 "id2"의 닉네임은 "C" 이다.
이제 고유한 아이디 한개당 닉네임을 알아냈으니 record를 처음부터 탐색하면서 문제 조건대로 출력해주면 된다.
2번 루프로 끝낼 수 있고 최대 record의 길이는 100000이므로 시간복잡도는 충분하다.
<전체코드>
import java.util.*;
class Solution {
StringTokenizer st = new StringTokenizer("");
HashMap<String,String> idToName = new HashMap<>();
public String[] solution(String[] record) {
for(int i=record.length-1;i>=0;i--){
st = new StringTokenizer(record[i]);
if(st.nextToken().equals("Leave")) continue;
String id = st.nextToken(), name = st.nextToken();
if(!idToName.containsKey(id)) idToName.put(id,name);
}
ArrayList<String> ans = new ArrayList<>();
String in = "님이 들어왔습니다.";
String out = "님이 나갔습니다.";
for(int i=0;i<record.length;i++){
st = new StringTokenizer(record[i]);
String s = st.nextToken();
if(s.equals("Enter")) ans.add(idToName.get(st.nextToken())+in);
else if(s.equals("Leave")) ans.add(idToName.get(st.nextToken())+out);
}
return ans.toArray(new String[ans.size()]);
}
}
'algorithm' 카테고리의 다른 글
[JAVA] 2048(Easy) 삼성 기출 문제 (백준 12100) (0) | 2020.09.01 |
---|---|
[JAVA] 후보키 (kakao 2019 프로그래머스) (0) | 2020.08.30 |
[JAVA] 가사검색 (kakao 2020 프로그래머스) (0) | 2020.08.24 |
[JAVA] 기둥과 보 설치( 프로그래머스 kakao 2020 공채) (0) | 2020.08.21 |
[JAVA] 메모리 사용량과 시간을 줄이는 간단한 아이디어 (0) | 2020.08.20 |
댓글