프로그래머스 오픈채팅방: https://programmers.co.kr/learn/courses/30/lessons/42888
코딩테스트 연습 - 오픈채팅방
오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오
programmers.co.kr
public class Main {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
int cnt = 0;
String[] record = {
"Enter uid1234 Muzi",
"Enter uid4567 Prodo",
"Leave uid1234",
"Enter uid1234 Prodo",
"Change uid4567 Ryan"};
for (int i = 0; i < record.length; i++) {
String[] msg = record[i].split(" ");
String move = msg[0];
String uid = msg[1];
String name = "";
if (!msg[0].equals("Leave")) name = msg[2];
if (move.equals("Enter")) {
map.put(uid, name);
} else if (move.equals("Change")) {
map.put(uid, name);
cnt++;
}
}
String[] rst = new String[record.length - cnt];
for (int i = 0; i < record.length; i++) {
String[] msg = record[i].split(" ");
String move = msg[0];
String uid = msg[1];
String name = "";
if (!msg[0].equals("Leave")) name = msg[2];
if (move.equals("Enter"))
rst[i] = map.get(uid) + "님이 들어왔습니다.";
else if (move.equals("Leave"))
rst[i] = map.get(uid) + "님이 나갔습니다.";
}
ArrayList<String> answer = new ArrayList<>();
for (int i = 0; i < rst.length; i++)
if (rst[i] != null)
answer.add(rst[i]);
answer.toArray(new String[0]);
}
}
로직
1. record 파싱
record는 [행동][uid][이름]으로 나눌 수 있다.
[행동]은 [Enter][Leave][Change]로 나눌 수 있다.
package code.openChat;
import java.util.*;
public class Main {
public static void main(String[] args) {
String[] record = {
"Enter uid1234 Muzi",
"Enter uid4567 Prodo",
"Leave uid1234",
"Enter uid1234 Prodo",
"Change uid4567 Ryan"};
String[] msg = record[i].split(" ");
String move = msg[0];
String uid = msg[1];
String name = "";
if (!msg[0].equals("Leave")) {
name = msg[2];
}
}
}
[Enter]일때는 id와 name이 있을 것이고
[Leave]일때는 id만 있으므로 위와 같이 코드를 만들었다.
2. 출력
[Enter]일 경우 "%s님이 들어왔습니다."
[Leave]일 경우 "%s님이 나갔습니다." 두 가지 경우가 있다.
Change일 경우 Map에서 uid를 검색하여 Value를 뒤에 있는 이름으로 변경하면 된다.
테스트 1 〉 통과 (2.07ms, 81.5MB)
테스트 2 〉 통과 (2.12ms, 72.2MB)
테스트 3 〉 통과 (2.10ms, 74.2MB)
테스트 4 〉 통과 (2.45ms, 78.2MB)
테스트 5 〉 통과 (5.62ms, 84.7MB)
테스트 6 〉 통과 (7.49ms, 87MB)
테스트 7 〉 통과 (4.90ms, 80.2MB)
테스트 8 〉 통과 (5.25ms, 79.7MB)
테스트 9 〉 통과 (5.66ms, 75.6MB)
테스트 10 〉통과 (6.73ms, 85.8MB)
테스트 11 〉통과 (5.93ms, 76.7MB)
테스트 12 〉통과 (4.52ms, 78.4MB)
테스트 13 〉통과 (6.66ms, 77.9MB)
테스트 14 〉통과 (6.16ms, 87.8MB)
테스트 15 〉통과 (2.10ms, 73.5MB)
테스트 16 〉통과 (2.58ms, 82.6MB)
테스트 17 〉통과 (3.52ms, 81.6MB)
테스트 18 〉통과 (3.94ms, 77.6MB)
2단계라기엔 생각보다 쉬웠던 문제였다.
다른 개발자들의 코드
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
private static final String ENTER_FORMAT = "%s님이 들어왔습니다.";
private static final String LEAVE_FORMAT = "%s님이 나갔습니다.";
private HashMap<String, UserInfo> userMap = new HashMap<>();
private class UserInfo {
public String userId;
public String nickName;
public UserInfo(String userId, String nickName) {
this.userId = userId;
this.nickName = nickName;
}
}
private class Command {
public char command;
public String userId;
public Command(char command, String userName) {
this.command = command;
this.userId = userName;
}
}
public String[] solution(String[] records) {
ArrayList<Command> commandList = new ArrayList<>();
for (String record : records) {
String[] split = record.split(" ");
String command = split[0];
String userId = split[1];
String nickName = null;
switch(command.charAt(0)) {
case 'E': // Enter
nickName = split[2];
if(userMap.containsKey(userId) == false) {
userMap.put(userId, new UserInfo(userId, nickName));
} else {
userMap.get(userId).nickName = nickName;
}
commandList.add(new Command(command.charAt(0), userId));
break;
case 'L': // Leave
commandList.add(new Command(command.charAt(0), userId));
break;
case 'C': // Change
nickName = split[2];
userMap.get(userId).nickName = nickName;
break;
}
}
return commandList.stream()
.map(cmd -> String.format( cmd.command == 'E' ? ENTER_FORMAT : LEAVE_FORMAT , userMap.get(cmd.userId).nickName))
.toArray(ary -> new String[commandList.size()]);
}
}
return commandList.stream()
.map(cmd -> String.format( cmd.command == 'E' ? ENTER_FORMAT : LEAVE_FORMAT , userMap.get(cmd.userId).nickName))
.toArray(ary -> new String[commandList.size()]);
1. 자바스럽게 짜는게 너무 멋있다..
2. command도 객체로 만드니까 더 간단해지는구나..
3. return을 stream() + 삼항연산자 + toArray() 메서드까지 쓰면 10줄은 줄이는구나..
'알고리즘 공부' 카테고리의 다른 글
프로그래머스 스택/큐 : [기능개발] Java 풀이 (0) | 2022.04.30 |
---|---|
프로그래머스 팁스다운 : [예상 대진표] Java 문제 풀이 (재귀) (0) | 2022.04.26 |
프로그래머스 탐욕법(그리디) : [폰켓몬] Java 문제 풀이 (한 줄) (0) | 2022.04.25 |
프로그래머스 카카오 : [크레인 인형뽑기 게임] Java 문제 풀이 (0) | 2022.04.23 |
프로그래머스 2017:팁스다운 [짝지어 제거하기] Java 문제 풀이 (0) | 2022.04.21 |