문제설명
카카오톡 오픈채팅방이 있다. 이 채팅방에서는 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다.
이 채팅방에 입장한다면 "[닉네임]님이 들어왔습니다."가 출력된다. 반대로 채팅방을 나가면 "[닉네임]님이 나갔습니다."가 출력된다. 이 채팅방에서는 닉네임을 변경할 수 있는 기능이 있는데 채팅방을 나간 후 새로운 닉네임으로 다시 들어가는 경우와 채팅방에서 닉네임을 변경하는 경우가 있다. 이 경우 기존 출력된 메시지가 변경한 닉네임을 기준으로 변경된다.
최종적으로 마지막으로 활동한 사람까지의 메시지를 반환하면 되는 문제이다.
※제한사항
- record는 문자열이 담긴 배열이며, 1 이상 100,000 이하이다.
- 모든 유저는 [유저 아이디]로 구분한다.
- 첫 단어는 Enter, Leave, Change 중 하나이다.
- 유저 아이디와 닉네임은 알파벳 대문자 소문자를 구별한다.
- 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다
풀이
나는 이 문제를 단순 반복문을 사용하는 접근하였다.
먼저 주어진 record(string[]) 배열를 살펴보면 ["Enter uid1234 Muzi", "Enter uid4567 Prodo"]와 같은 형태로 되어 있다. 그렇기에 사용자가 하려는 행동이 무엇인지 구분하기 위해 행동별로 나눠주어야 한다.
그 다음 행동, 아이디, 닉네임으로 분류가 된 데이터를 반복문을 돌려 행동이 "Enter"나 "change"인 경우 name를 최신화 해주는 작업을 한다. 여기서 name은 유저아이디 별로 닉네임을 관리하는 객체이다. 그런 다음 앞서 나눠준 값을 다시 반복문을 돌려 행동이 "Enter" 이거나 "Leave" 인 경우 "answer.push(`${name[data[1]]}님이 들어왔습니다.`)" 이런 형태로 들어오거나 나가는 경우를 구분하여 최종적으로 반환할 값에 추가시켜주는 작업을 한 뒤 최종값을 반환해주면 해결된다.
아래는 풀이에 사용한 코드이다.
function solution(record) {
var answer = []; // 최종적으로 반환할 값을 저장하는 배열
var result = []; // record를 구분하여 나눈값을 저장하는 배열
var name = {}; // 유저아이디 별로 관리하기 위해 사용한 객체
// 제공된 값을 구분하기 위한 로직
record.map((data) => result.push(data.split(' ')))
// 이름을 최신값으로 유지하기 위한 로직
result.map((data) => {
if(data[0] === 'Enter' || data[0] === 'Change' ){
name[data[1]] = data[2]
}
})
// 행동 별 로직
result.map((data) => {
if(data[0] === 'Enter'){
answer.push(`${name[data[1]]}님이 들어왔습니다.`)
}else if(data[0] === 'Leave'){
answer.push(`${name[data[1]]}님이 나갔습니다.`)
}
})
return answer;
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.01 연습문제 추억 점수 (JavaScript) (0) | 2024.04.26 |
---|---|
[프로그래머스] Lv.02 연습문제 예상 대진표 (JavaScript) (0) | 2024.04.23 |
[프로그래머스] Lv.02 연습문제 영어 끝말잇기 (JavaScript) (0) | 2024.04.18 |
[프로그래머스] Lv.02 연습문제 하노이의 탑 (JavaScript) (0) | 2024.04.15 |
[프로그래머스] Lv01 연습문제 약수의 개수와 덧셈 (JavaScript) (0) | 2024.04.14 |