[Java] 프로그래머스 Lv2_오픈채팅방
Categories: Programmers
Tags: CodingTest, 실습
📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]
[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 신경 안써도 되고 안전하며 가독성이 더 좋아서 두 번째가 더 나은 코드인 것 같다.
Leave a comment