[Java] 프로그래머스 Lv2_오픈채팅방

Updated:

Categories:

Tags: ,

📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]

[Java] 프로그래머스 Lv2_오픈채팅방

오늘의 문제는 카카오~ 2019년 블라인드 채용시 코딩테스트 문제이다…

풀어보기🔗

닉네임은 중간에 바뀔 수도 있어서 Map에 key를 id로 담고 닉네임으로 value에 담으면 나중에 변경되면 그때 다시 put하면 알아서 바뀌니까 쉽네 하고 일단 구현 먼저 했다.

1️⃣ 첫 풀이 : 런타임 에러

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.Map;
import java.util.HashMap;

class Solution {
    public String[] solution(String[] record) {
        
        //answer에는 change를 제외한 결과만 담아야 함
        //Leave일때는 id만 나옴
        int change = 0;

        
        //아이디랑 닉네임 담을 map
        Map<String, String> map = new HashMap<>();
        
        for(String str : record) {
            //공백으로 구분
            String[] result = str.split(" ");
            if(result[0].equals("Enter")) {
                map.put(result[1], result[2]);
                
            } else if(result[0].equals("Change")) {
                map.put(result[1], result[2]);
                change ++;
            }
        }
        
        String[] answer = new String[record.length - change];
        
        int idx = 0;
        
        for(String str : record) {
            String[] result = str.split(" ");
             
            if(result[0].equals("Enter")) {
                answer[idx] = String.format("%s님이 들어왔습니다.", map.get(result[1]));   
                
            } else if(result[0].equals("Leave")) {
                answer[idx] = String.format("%s님이 나갔습니다.", map.get(result[1]));   
            }
            
            idx ++;
        }
        
        return answer;
    }
}   
  • 풀다보니까 이렇게 풀면 터질 것 같은데 어쩌지하다가…! 일단 구현 먼저니까 하고 풀었는데…일단 통과

  • 런타임 에러라서 성능 이슈 인 줄 알았는데, 나중에 다시보니 idx 문제였음.. 그건 아래에!

2️⃣ 두번째 풀이 : 통과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;

class Solution {
    public String[] solution(String[] record) {
      
        //answer에는 change를 제외한 결과만 담아야 함
        //Leave일때는 id만 나옴
        
        //answer 배열 길이
        int n = 0;
        
        Map<String, String> message = new HashMap<>();
        
        message.put("Enter", "님이 들어왔습니다.");
        message.put("Leave", "님이 나갔습니다.");
        
        //아이디랑 닉네임 담을 map
        Map<String, String> map = new HashMap<>();
        
        for(String str : record) {
            //공백으로 구분
            String[] result = str.split(" ");
            if(result.length == 3) {
                map.put(result[1], result[2]);
            } 
        }
        
        List<String> answer = new ArrayList<>();
    
        for(String str : record) {
            //공백으로 구분
            String[] result = str.split(" ");
            if(message.containsKey(result[0])) {
                answer.add (map.get(result[1]) + message.get(result[0]));
            
            }
        }
        return answer.toArray(new String[0]);
    }
}   

조금 어질러져 있는 코드 정리하고 배열이 아닌 ArrayList를 사용했고

성능적으로 큰 차이 없을 것 같은데 저 런타임에러가 성능문제가 아니라 그냥 예외터지거나 할때도 생기니까 안전하게 ArrayList로 풀어보았다.

무난하게 통과~

3️⃣ 다시 푼 첫 풀이 : 통과

아무리 봐도 첫번째 문제도 똑같이 O(N)이니까 그렇게 성능 차이가 없을 것 같은데 하고 다시 봤더니
idx를 다 추가해주고 있었음…
그래서 idx를 enter랑 leave일때만 추가하니까 통과…! (코드는 거의 똑같고 ‘//여기 수정’ 부분만 수정했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.util.Map;
import java.util.HashMap;

class Solution {
    public String[] solution(String[] record) {
        
        //answer에는 change를 제외한 결과만 담아야 함
        //Leave일때는 id만 나옴
        int change = 0;

        
        //아이디랑 닉네임 담을 map
        Map<String, String> map = new HashMap<>();
        
        for(String str : record) {
            //공백으로 구분
            String[] result = str.split(" ");
            if(result[0].equals("Enter")) {
                map.put(result[1], result[2]);
                
            } else if(result[0].equals("Change")) {
                map.put(result[1], result[2]);
                change ++;
            }
        }
        
        String[] answer = new String[record.length - change];
        
        int idx = 0;
        
        for(String str : record) {
            String[] result = str.split(" ");
             
            if(result[0].equals("Enter")) {
                answer[idx] = String.format("%s님이 들어왔습니다.", map.get(result[1])); 
                idx ++;  // 여기 수정
                
            } else if(result[0].equals("Leave")) {
                answer[idx] = String.format("%s님이 나갔습니다.", map.get(result[1]));
                idx ++; // 여기 수정
            }

            //idx ++; >> 여기 지우고 조건문에만 추가
        }
        
        return answer;
    }
}   
  • 성능이나 그런 문제가 아니라 그냥 idx 때문에 에러났나보다.


성능은 별 차이 없을 것 같고(둘다 시간복잡도 O(N)) 메모리적 측면에서는 첫 번째 코드가 더 낫지 않았나 싶지만
(배열의 크기를 미리 지정해두었기때문에 메모리적 측면에서 더 나을 거라 예상)
idx 신경 안써도 되고 안전하며 가독성이 더 좋아서 두 번째가 더 나은 코드인 것 같다.




Programmers 카테고리 내 다른 글 보러가기

Leave a comment