반응형
Notice
Recent Posts
Recent Comments
Link
It's easy, if you try
[프로그래머스] 오픈채팅방 (Java) - 2019 KAKAO BLIND RECRUITMENT / 자료구조 본문
반응형
문제
풀이
첫번째 풀이
import java.util.*;
// queue에는 uid, true/false 를 넣는다.
// user는 HashMap<uid, nickName>.
class Solution {
public String[] solution(String[] record) {
Queue<HashMap<String, Boolean>> queue = new LinkedList<>();
HashMap<String, String> user = new HashMap<>();
int recordLen = record.length;
for(String r : record) {
String oper = r.split(" ")[0];
String uid = r.split(" ")[1];
String nickName = "";
if(!oper.equals("Leave"))
nickName = r.split(" ")[2];
HashMap<String, Boolean> temp = new HashMap<>();
switch(oper) {
case "Enter":
user.put(uid, nickName); // 유저가 들어옴
temp.put(uid, true); // 유저가 들어옴
queue.offer(temp);
break;
case "Leave":
temp.put(uid, false); // 유저가 나감
queue.offer(temp);
break;
case "Change":
user.replace(uid, nickName); // 유저 닉네임 변경
recordLen--;
break;
}
}
String[] answer = new String[recordLen];
int i=0;
while(!queue.isEmpty()) {
HashMap<String, Boolean> temp = queue.poll();
String uid = "";
for(String key: temp.keySet())
uid = key;
if(temp.get(uid)){ // 들어왔습니다.
answer[i] = user.get(uid) +"님이 들어왔습니다.";
} else {
answer[i] = user.get(uid)+"님이 나갔습니다.";
}
i++;
}
return answer;
}
}
queue를 이용해서 해당 아이디가 들어오고 나간 내역을 저장했다.
HashMap에서는 Enter일 땐 유저id와 닉네임을 put하고, Change일 땐 해당 유저 id의 닉네임을 replace했다.
그러나 queue에 해시맵을 생성하고 offer하는 과정과 poll해서 사용하는 과정이 복잡했다. 이를 아주 간단하게 해결할 수 있었다.(두번째 풀이)
두번째 풀이
그냥 record 배열을 두번 반복하면 queue를 사용하지 않아도 된다.
- 첫번째 반복에서는 유저가 들어오는 것과, 닉네임을 변경하는 것만 처리한다. 그럼 HashMap 마지막 상태는 유저아이디에 해당하는 최종 닉네임만 남아있다. (유저 닉네임이 변경되면 들어왔습니다의 닉네임도 변경되기 때문에 이 작업이 중요하다.)
- 두번째 반복에서는 Enter일 땐, HashMap 유저아이디의 최종 닉네임이 들어왔습니다를 answer에 할당하고, Leave일 땐, 나갔습니다를 할당하면 된다.
import java.util.*;
class Solution {
public String[] solution(String[] record) {
HashMap<String, String> user = new HashMap<>();
String oper="";
String uid="";
String nickName="";
int recordLen = record.length;
for(String r : record) {
oper = r.split(" ")[0];
uid = r.split(" ")[1];
if(!oper.equals("Leave"))
nickName = r.split(" ")[2];
switch(oper) {
case "Enter":
user.put(uid, nickName); // 유저가 들어옴
break;
case "Change":
user.replace(uid, nickName); // 유저 닉네임 변경
recordLen--;
break;
}
}
String[] answer = new String[recordLen];
int i=0;
for(String r: record) {
oper = r.split(" ")[0];
uid = r.split(" ")[1];
switch(oper) {
case "Enter":
answer[i++] = user.get(uid)+"님이 들어왔습니다.";
break;
case "Leave":
answer[i++] = user.get(uid)+"님이 나갔습니다.";
break;
}
}
return answer;
}
}
반응형
'알고리즘 > 자바(Java)' 카테고리의 다른 글
[백준/boj] 14938: 서강그라운드 (Java) / 플로이드 와샬 (0) | 2021.06.19 |
---|---|
[Codility] Lesson4 - FrogRiverOneFind (Java) (0) | 2021.06.18 |
[프로그래머스] 괄호 변환 - 2020 KAKAO BLIND RECRUITMENT (Java) / 구현 / 스택 (0) | 2021.06.02 |
[프로그래머스] 여행경로 (JAVA) / DFS (0) | 2021.05.02 |
[백준/boj] 14500: 테트로미노 (Java) / 브루트포스 / 구현 (0) | 2021.04.25 |
Comments