- 내 방법 풀이
- 문제를 읽고, Id값과 닉네임을 보고, HashMap을 사용하면 되겠다는 생각이 들었다. 먼저 record를 읽으면서 유저 아디와 닉네임을 (key,value) 값으로 저장하되 맨 앞 단어가 Enter와 Change일 경우에 add하는 조건을 걸었다. 왜나하면 Leave는 아이디 값만 가지고 있어 닉네임 값이 없기 때문이었다.
- 위의 과정을 통해 최종 변경된 값만 가지고 있는 고유ID와 닉네임 Map을 얻게 되었고, 다시 한 번 record를 조회하면서 첫 단어를 switch문으로 가져와서 각 경우에 맞는 메시지를 저장하도록 코드를 구성했다.
- 최종변경된 메시지만 출력하면 되므로 복잡한 과정없이 2번의 record 조회로 문제를 풀 수 있었다.
- 효율성 측면에서도 record의 최대 길이 * 2 = 200,000번이라서 충분히 시간을 통과할 수 있을 거 같았고, 통과했다.
- 오랜만에 한번에 푼 문제여서 기분이 좋다.

import java.util.*;
class Solution {
public String[] solution(String[] record) {
String[] answer = {};
// HashMap 1 : record를 읽으면서 유저 아디를 key, 닉네임을 value로 저장.
HashMap<String, String> idToNickname = new HashMap<>();
for (String S : record) {
String[] arr = S.split(" ");
if (arr[0].equals("Enter") || arr[0].equals("Change")) idToNickname.put(arr[1],arr[2]);
}
// record를 읽으며, 기록에 따른 메시지 출력.
ArrayList<String> messages = new ArrayList<>();
for (String S : record) {
String[] arr = S.split(" ");
switch (arr[0]) {
case "Enter": messages.add(idToNickname.get(arr[1]) + "님이 들어왔습니다.");
break;
case "Leave": messages.add(idToNickname.get(arr[1]) + "님이 나갔습니다.");
break;
case "Change": break;
}
}
return messages.toArray(answer);
}
}
- 다른 사람 방법 풀이
- 자바스럽다라는 말은 코테 문제를 준비하면서 처음 듣게된 말이었다.
- 밑의 코드는 자바스러운 코드가 아닐까 싶다. 실제 웹 서비스를 구현하기 위해서는 아래와 같은 방법이 쓰여야 하는데, 과연 나는 실제로 아래와 같이 쓸 수 있을까..
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()]);
}
}
'개발지 > 코테' 카테고리의 다른 글
[프로그래머스] 코테연습 - PCCE 기출문제 10번 / 데이터 분석 (0) | 2023.12.18 |
---|---|
[프로그래머스] 코테연습 - 크레인 인형뽑기 게임(lv.1) (2) | 2023.12.11 |
[프로그래머스] 코테연습 - 공원 산책(lv.1) (2) | 2023.12.06 |
[프로그래머스] 코테연습 - 124 나라의 숫자(lv.2) (2) | 2023.12.04 |
[프로그래머스] 코테연습 - N개의 최소 공배수(lv.2) (0) | 2023.11.30 |