https://programmers.co.kr/learn/courses/30/lessons/42888
오픈채팅방 문제를 풀었습니다.
아무래도 이 문제의 키 포인트는 hashmap을 바로 떠올리냐라고 생각을 하고 처음에는 문제를 헤매었는데 아마 저처럼 헤매시는 분들도 많을 것 같아서 틀린 소스와 정답 소스를 같이 올려서 비교해보겠습니다.
처음에 짠 틀린 코드
해시맵을 사용하려고 한 생각은 맞았지만 hashmap의 id와 nickname을 저장하는 과정을 한 번에 진행하려다 보니까 문제가 꼬였습니다. 이 풀이처럼 하게 되면 해시 맵의 nickname이 시도 때도 없이 변경되어서 틀리게 됩니다.
class Solution {
public String[] solution(String[] record) {
String temp = "";
String userId = "";
String nickName ="";
int idx = 0;
HashMap<String, String> hashMap = new HashMap<>(); // Key : ID, Value : Nickname
int count =0;
for(String num : record){
temp = num.split(" ")[0];
if(!temp.equals("Change")){
count++;
}
}
String[] answer = new String[count];
for(String recordSplit: record){
temp = recordSplit.split(" ")[0];
userId = recordSplit.split(" ")[1];
if(!temp.equals("Leave")){
nickName = recordSplit.split(" ")[2];
}
if(temp.equals("Enter")){
answer[idx] = userId + "님이 들어왔습니다.";
} else if(temp.equals("Leave")){
answer[idx] = userId + "님이 나갔습니다.";
} else{
idx--;
}
if(temp.equals("Enter") || temp.equals("Change")){
hashMap.put(userId, nickName); // 저장 완료, 계속실행되면 안되넴..
}
idx++;
}
for(int sIdx =0; sIdx<answer.length; sIdx++){
for(String key : hashMap.keySet()){
answer[sIdx] = answer[sIdx].replace(key,hashMap.get(key));
}
}
for(String a: answer){
System.out.println(a);
}
return answer;
}
}
정답 소스
해시맵에 값이 이상하게 들어가는 것을 보고 해시 맵을 먼저 만들자라는 생각을 했습니다.
그리고 해시맵을 만든 후에 풀이를 진행하니 위에 풀이처럼 id랑 nickname을 바꾸는 프로세스도 필요 없어졌기 때문에 훨씬 더 간략한 풀이를 만들 수 있었고, 모든 테스트 케이스를 통과할 수 있었습니다.
class Solution {
public String[] solution(String[] record) {
HashMap<String, String> map = new HashMap<>();
int count=0; int idx=0;
for(int i=0; i<record.length; i++){ // key, value 값 만들기
String[] recordSplit = record[i].split(" ");
if(!recordSplit[0].equals("Leave")){
map.put(recordSplit[1], recordSplit[2]);
}
if(!recordSplit[0].equals("Change")){
count++;
}
}
String[] answer = new String[count]; // answer 생성
for(int j=0; j<record.length; j++){
String[] recordSplit = record[j].split(" ");
if(recordSplit[0].equals("Enter")){
answer[idx] = map.get(recordSplit[1])+"님이 들어왔습니다.";
idx++;
} else if(recordSplit[0].equals("Leave")){
answer[idx] = map.get(recordSplit[1])+"님이 나갔습니다.";
idx++;
}
}
return answer;
}
}
혹시 틀린점이나 궁금한 점이 있으시면 댓글 남겨주세요.
'알고리즘' 카테고리의 다른 글
프로그래머스 - 소수찾기 (0) | 2020.04.04 |
---|---|
프로그래머스 - 모의고사 (0) | 2020.04.04 |
프로그래머스 - 캐시(성공) (0) | 2020.03.28 |
프로그래머스 - 캐시(실패) (0) | 2020.03.28 |
프로그래머스 - 뉴스 클러스터링 (0) | 2020.03.27 |