1. 문제
2. 풀이 과정
이 문제의 핵심은 닉네임이 변경되는 부분이다.
닉네임이 변경되는 경우는 두 가지 케이스이다.
1. Enter - Leave - 다른닉네임으로 Enter
2. Change
닉네임이 변경되면 기존의 메시지에 있던 닉네임들이 바뀐 닉네임으로 바뀌게 된다.
record를 하나하나씩 바로바로 메시지로 변환하다보면 중간에 닉네임이 변경됐을 때, 모든 메시지를 다시 바꿔야하는 불상사가 발생한다.
따라서 닉네임에 대한 변경을 먼저 파악하고 메시지를 최종적으로 한번에 뽑아내야하는 식으로 접근해야한다.
1. 최종 닉네임 파악하기
record를 보고 최종적인 유저들의 닉네임을 알아내야한다.
닉네임의 추가 및 변경이 일어나는 명령어는 Enter와 Change이다.
두 명령어가 들어올 때마다 닉네임을 추가하거나 수정하면 된다.
이러한 정보를 잘 관리할 수 있는 자료구조는 해시맵이다.
아이디를 key로, 닉네임을 value로 저장한다면 특히 수정과정을 효율적으로 할 수 있다.
2. record를 가지고 메시지 생성하기
1에서 가져온 최종 닉네임 정보를 기반으로 record를 하나하나 생성하면 된다.
메시지가 추가되는 명령어는 다음과 같다.
1) Enter - [nickname]님이 들어왔습니다.
2) Leave - [nickname]님이 나갔습니다.
3. 내 코드
import java.util.*;
class Solution {
public List solution(String[] record) {
List<String> message = new ArrayList<>();
HashMap<String, String> member = new HashMap<>();
// 각 멤버의 최종 닉네임 알아내기
for(String r: record) {
String command = r.split(" ")[0];
String id = r.split(" ")[1];
if(command.equals("Enter") || command.equals("Change")) {
String nickname = r.split(" ")[2];
member.put(id, nickname);
}
}
// 기록에 따른 메시지 설정
for(String r: record) {
String command = r.split(" ")[0];
String id = r.split(" ")[1];
if(command.equals("Enter")) {
message.add(member.get(id) + "님이 들어왔습니다.");
} else if(command.equals("Leave")) {
message.add(member.get(id) + "님이 나갔습니다.");
}
}
return message;
}
}
시간 복잡도
- O(N)
4. 피드백
- 하나의 데이터는 고정이고 하나의 데이터는 변한다고 했을 때 해시 맵을 사용한다면 그 변하는 데이터에 대한 수정을 효율적으로 할 수 있다.
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 신고 결과 받기 (0) | 2024.05.08 |
---|---|
[프로그래머스] 베스트 앨범 (0) | 2024.05.08 |
[프로그래머스] 할인 행사 (0) | 2024.05.07 |
[프로그래머스] 완주하지 못한 선수 (0) | 2024.05.07 |
[프로그래머스] 두 개의 수로 특정값 만들기 (0) | 2024.05.06 |