소요시간
30분.
문제 이해하는데 5분 ,
전체적으로 푸는데 20분
예외처리 5분
사용한 알고리즘
해시맵.
사용자의 id를 key로,
닉네임을 value 로 가지고 있어야 한다.
시간복잡도는 record 배열의 길이를 n이라고 하면
O(n) 이 걸릴 것으로 에상했다.
문제 해결 과정
우선 이 문제는 마지막으로 입장한 , 혹은 변경한 닉네임이 value로 있어야 한다. 처음의 for문에서 사용자가 입장, 혹은 닉네임을 변경할 때마다 해시맵의 value를 바꿔주었다. 이 작업이 o(n) 이 걸렸고,
두 번째로 결국 마지막으로 저장된 해시맵의 value 로 사람이 들어왔을 떄, 혹은 나갔을 때 return해야할 문자열을 저장해주면 됐다. 이 작업이 o(n) 이 걸렸다.
o(n) + o(n) = o(n) .
풀이 과정
소스코드
import java.util.*;
class Solution {
public String[] solution(String[] record) {
HashMap<String,String> map=new HashMap<>();
int cnt=0;
String enter="님이 들어왔습니다.";
String leave="님이 나갔습니다.";
String n3="";
for(int i=0;i<record.length;i++){
String line[]=record[i].split(" ");
String n1=line[0];
String n2=line[1];
if(line.length>2)
n3=line[2];
if(n1.equals("Enter")){
map.put(n2,n3);
cnt++;
}
if(n1.equals("Change")){
map.put(n2,n3);
}
if(n1.equals("Leave")){
cnt++;
}
}
String arr[]=new String[cnt];
int index=0;
for(int i=0;i<record.length;i++){
String line[]=record[i].split(" ");
String n1=line[0];
String n2=line[1];
if(line.length>2)
n3=line[2];
String name=map.get(n2);
if(n1.equals("Enter")){
arr[index++]=name+enter;
}
else if(n1.equals("Leave")){
arr[index++]=name+leave;
}
}
return arr;
}
}
회고
문제 자체가 굉장히 쉬웠다. 큰 어려움 없이 문제를 풀었으나 split 했을 때 배열의 길이가 다른 경우에 대해서 왜 이런 오류가 발생했는지 5분이나 고민한 것이 그렇게 좋다고만은 할 수 없는 것 같다. 내일은 소프트웨어 마에스트로 2차 코딩테스트다. 붙을 수 있으려나 ?
하루에 백준 1문제 이상 푸는 것을 목표로 하고 있습니다.
https://solved.ac/profile/anwlro0212