📑 1. 문제설명





💡 2. 풀이 과정
일단 문제가 길어도 너무 길어서 나름대로 요약을 해 봤다.
record 배열은 입장 또는 퇴장 정보를 담고 있는 2차원 배열이다.
- 입장은 ["Enter id 닉네임"] → "닉네임님이 들어왔습니다."
- 퇴장은 ["Leave id"] → "닉네임님이 나갔습니다."
- 닉변은 ["Change id 닉네임"]
record
- 0번 인덱스 = 행동(입장/퇴장/닉변)
- 1번 인덱스 = id
- 2번 인덱스 = 닉네임
여기서 중요한 것은 채팅방에 보여지는 메세지에는 최종적으로 변경된 닉네임이 보여져야 한다는 것이다.
그렇다면 한 아이디가 가장 마지막으로 사용한 닉네임이 무엇인지 조회하고 메세지를 보여줄 때 아이디값을 그 닉네임으로 바꾸는 방법으로 문제를 해결해야 한다.
닉네임 정보를 저장하기 위해서 Map을 사용한다.
✅ 채팅방 입장
- id와 닉네임 값을 매핑해서 하나의 기록마다 닉네임 변경사항을 업데이트해서 저장한다.
Map<String, String> idMap = new HashMap<>(); // (id - nickname) Map
✅ 닉네임 변경
- 닉네임을 변경할 때는 채팅방에 메세지가 표시되지 않는다.
- 따라서 메세지에서 제외할 카운트를 별도로 선언해준 후, change 일 때 마다 값을 1증가 시킨다.
✅ record를 순회하면서 infomap에 key-value로 id-닉네임 저장하기
- record 배열의 [i] 번째 문자를 공백 기준으로 분리한 다음, data라는 배열에 담아준다.
- data[0]이 "Leave" -> continue 왜냐하면 얘는 세번째 인덱스가 없기 때문에
- data[0]이 "Enter" -> data[1]과 data[2]를 infomap에 담는다. (아이디 / 닉네임)
- 닉네임 변경 -> data[1]과 data[2]를 infomap에 담은 뒤 count++; (출력 숫자에서 제외하기 위함)
출력 메세지를 담을 String 타입의 배열 answer을 선언한다.
이 때 배열의 길이는 record.length - count 이다. (count는 제외시킬 개수)
이제 record를 순회하면서 nickname 변수에 infomap의 data[1]을 가져와 최종 닉네임을 저장한다.
이 때 닉네임은 id를 key로 해서 infomap에서 value값을 가져오는 방식이다.
닉네임은 nickname 변수에 담긴다.
⭐ 3. 정답코드
import java.util.*;
class Solution {
public String[] solution(String[] record) {
Map<String, String> infoMap = new HashMap<>(); // (id-nickname) Map
int count = 0;
for (int i = 0; i < record.length; i++) {
String[] data = record[i].split(" ");
if (data[0].equals("Leave")) { // 퇴장
continue;
} else if (data[0].equals("Enter")) { // 입장
infoMap.put(data[1], data[2]);
} else { // 닉네임 변경
infoMap.put(data[1], data[2]);
count++;
}
}
String[] answer = new String[record.length - count];
int idx = 0;
for (int i = 0; i < record.length; i++) {
String[] data = record[i].split(" ");
String nickname = infoMap.get(data[1]);
if (data[0].equals("Enter")) { // 입장 메시지
answer[idx++] = nickname + "님이 들어왔습니다.";
} else if (data[0].equals("Leave")) { // 퇴장 메시지
answer[idx++] = nickname + "님이 나갔습니다.";
}
}
return answer;
}
}
👏🏻 좋아요 가장 많이 받은 코드
와 클래스로 푼 이규철님과 ydy님의 코드
객체지향 폼 미쳤다
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()]);
}
}
🐦 4. TMI
오픈채팅방 문제 왜이렇게 길어
오픈 채팅방 쓰지 말고
그냥 채팅 하자. ^_^
'Algorithm > JAVA테스트' 카테고리의 다른 글
[코딩테스트] (Java) 십진수를 이진수로 변환하기 (스택) (17) | 2025.02.17 |
---|---|
[프로그래머스] (Java / 자바 ) 유연근무제 문제풀이 (11) | 2025.02.14 |
[프로그래머스] (Java) 문자열 섞기, 두 수의 연산값 비교하기 (16) | 2025.02.06 |
[프로그래머스] (Java) 문자열 섞기 (15) | 2025.02.06 |
[프로그래머스] (Java) 문자열 겹쳐쓰기 (25) | 2025.02.05 |
📑 1. 문제설명





💡 2. 풀이 과정
일단 문제가 길어도 너무 길어서 나름대로 요약을 해 봤다.
record 배열은 입장 또는 퇴장 정보를 담고 있는 2차원 배열이다.
- 입장은 ["Enter id 닉네임"] → "닉네임님이 들어왔습니다."
- 퇴장은 ["Leave id"] → "닉네임님이 나갔습니다."
- 닉변은 ["Change id 닉네임"]
record
- 0번 인덱스 = 행동(입장/퇴장/닉변)
- 1번 인덱스 = id
- 2번 인덱스 = 닉네임
여기서 중요한 것은 채팅방에 보여지는 메세지에는 최종적으로 변경된 닉네임이 보여져야 한다는 것이다.
그렇다면 한 아이디가 가장 마지막으로 사용한 닉네임이 무엇인지 조회하고 메세지를 보여줄 때 아이디값을 그 닉네임으로 바꾸는 방법으로 문제를 해결해야 한다.
닉네임 정보를 저장하기 위해서 Map을 사용한다.
✅ 채팅방 입장
- id와 닉네임 값을 매핑해서 하나의 기록마다 닉네임 변경사항을 업데이트해서 저장한다.
Map<String, String> idMap = new HashMap<>(); // (id - nickname) Map
✅ 닉네임 변경
- 닉네임을 변경할 때는 채팅방에 메세지가 표시되지 않는다.
- 따라서 메세지에서 제외할 카운트를 별도로 선언해준 후, change 일 때 마다 값을 1증가 시킨다.
✅ record를 순회하면서 infomap에 key-value로 id-닉네임 저장하기
- record 배열의 [i] 번째 문자를 공백 기준으로 분리한 다음, data라는 배열에 담아준다.
- data[0]이 "Leave" -> continue 왜냐하면 얘는 세번째 인덱스가 없기 때문에
- data[0]이 "Enter" -> data[1]과 data[2]를 infomap에 담는다. (아이디 / 닉네임)
- 닉네임 변경 -> data[1]과 data[2]를 infomap에 담은 뒤 count++; (출력 숫자에서 제외하기 위함)
출력 메세지를 담을 String 타입의 배열 answer을 선언한다.
이 때 배열의 길이는 record.length - count 이다. (count는 제외시킬 개수)
이제 record를 순회하면서 nickname 변수에 infomap의 data[1]을 가져와 최종 닉네임을 저장한다.
이 때 닉네임은 id를 key로 해서 infomap에서 value값을 가져오는 방식이다.
닉네임은 nickname 변수에 담긴다.
⭐ 3. 정답코드
import java.util.*; class Solution { public String[] solution(String[] record) { Map<String, String> infoMap = new HashMap<>(); // (id-nickname) Map int count = 0; for (int i = 0; i < record.length; i++) { String[] data = record[i].split(" "); if (data[0].equals("Leave")) { // 퇴장 continue; } else if (data[0].equals("Enter")) { // 입장 infoMap.put(data[1], data[2]); } else { // 닉네임 변경 infoMap.put(data[1], data[2]); count++; } } String[] answer = new String[record.length - count]; int idx = 0; for (int i = 0; i < record.length; i++) { String[] data = record[i].split(" "); String nickname = infoMap.get(data[1]); if (data[0].equals("Enter")) { // 입장 메시지 answer[idx++] = nickname + "님이 들어왔습니다."; } else if (data[0].equals("Leave")) { // 퇴장 메시지 answer[idx++] = nickname + "님이 나갔습니다."; } } return answer; } }
👏🏻 좋아요 가장 많이 받은 코드
와 클래스로 푼 이규철님과 ydy님의 코드
객체지향 폼 미쳤다
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()]); } }
🐦 4. TMI
오픈채팅방 문제 왜이렇게 길어
오픈 채팅방 쓰지 말고
그냥 채팅 하자. ^_^
'Algorithm > JAVA테스트' 카테고리의 다른 글
[코딩테스트] (Java) 십진수를 이진수로 변환하기 (스택) (17) | 2025.02.17 |
---|---|
[프로그래머스] (Java / 자바 ) 유연근무제 문제풀이 (11) | 2025.02.14 |
[프로그래머스] (Java) 문자열 섞기, 두 수의 연산값 비교하기 (16) | 2025.02.06 |
[프로그래머스] (Java) 문자열 섞기 (15) | 2025.02.06 |
[프로그래머스] (Java) 문자열 겹쳐쓰기 (25) | 2025.02.05 |