42888. 오픈채팅방

2025-12-04
프로그래머스 42888번 풀이

이 글은 Obsidian에서 마이그레이션되었으며, 그 과정에서 AI의 도움을 받았습니다. 오류나 누락된 내용이 있다면 댓글로 알려주세요!

문제

코딩테스트 연습 - 오픈채팅방 | 프로그래머스 스쿨

풀이

아이디어

닉네임이 변경되면 과거 모든 메시지의 닉네임도 함께 변경된다는 점이 중요하다. 즉 최종적으로 보이는 메시지에는 각 유저의 최종 닉네임만 표시되기 때문에, 우선 최종 닉네임을 구한 뒤에 메시지 목록을 만들어줘야 한다.

1단계 : 최종 닉네임 구하기

record를 순회하면서 Enter나 Change가 발생할 때마다 해당 uid의 닉네임을 업데이트해줬다. Map은 같은 키에 값을 넣으면 덮어쓰기 되기 때문에 순회가 끝나면 자연스럽게 각 uid의 최종 닉네임이 저장된다.

const userMap = new Map();
for (let idx = 0; idx < record.length; idx++) {
	const [type, uid, name] = record[idx].split(' ');
	if (type === "Enter" || type === "Change") {
		userMap.set(uid, name);
	}
}

2단계 : 메시지 목록 생성

record를 다시 순회하면서 Enter나 Leave에 대해서만 메시지를 생성한다. 이 때 닉네임 부분은 userMap에 저장되어 있는 최종 닉네임을 사용한다.

const answer = [];
for (let idx = 0; idx < record.length; idx++) {
	const [type, uid, _] = record[idx].split(' ');
	if (type === "Enter") answer.push(`${userMap.get(uid)}님이 들어왔습니다.`);
	else if (type === "Leave") answer.push(`${userMap.get(uid)}님이 나갔습니다.`);
}

시간 복잡도

  • 시간 복잡도: N이 record 배열의 길이일 때 record를 두 번 순회하기 때문에 O(N)이다.