Algorithm/Coding Test
(KAKAO BLIND RECRUITMENT) 오픈채팅방
Bumang
2023. 7. 15. 14:46
https://school.programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 수준:
레벨2
입출력 예 (입력 / 출력):
["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] | ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."] |
문제 요약:
사용자가 할 수 있는 액션:
1. 사용자는 원하는 닉네임으로 입장할 수 있다.
2. 사용자는 입장 후 원하는 닉네임으로 변경할 수 있다.
3. 사용자는 퇴장할 수 있다.
4. 닉네임은 중복될 수 있다.
이 조건을 가지고 불특정 다수가 채팅할 수 있는 앱을 만들 때, 입장 메시지와 퇴장 메시지를 출력해야 된다.
이 메시지들은 닉네임을 변경할 시 메시지도 같이 바뀐다.
문제 풀이 전략
닉네임을 변경하거나, 중복이 가능하므로 입/퇴장때의 이름을 고유한 값으로 쓸 수 없다.
UID를 기준으로 가장 최근의 닉네임을 객체에 저장하여 메시지를 표출할 때만 아이디를 닉네임으로 변환하려 한다.
내 풀이:
function solution(record) {
const current = {} //마지막으로 변경된 닉네임을 아이디(고유값) : 닉네임(중복 가능한 값) 꼴로 저장한다.
const enterLine = "님이 들어왔습니다."
const leaveLine = "님이 나갔습니다."
const temp = [] //[아이디, 행동]꼴로 log를 저장하는 곳.
const result = [] //문제에서 요구한대로 배열 형태로 return해야되기 때문에 포맷에 맞춰 정제한 배열
for (let i = 0; i < record.length; i++){
const spl = record[i].split(" ") //입력값을 스페이스를 기준으로 나눈다.
if (spl[0] !== "Leave"){ // 액션이 Leave가 아닐때만,
current[spl[1]] = spl[2]
/* current 객체에 '아이디 : 닉네임'으로 업데이트 한다.
Leave할 때는 닉네임이 데이터에 제공되지 않기 때문에 하지 않는다..*/
}
if (spl[0] === "Change") {
continue //단순 닉네임 변경일 때는 들어오기/나가기 메시지에 업데이트하지 않고 continue
} else
if (spl[0] === "Enter") { // 유저가 들어온 경우이면
temp.push([spl[1] , enterLine]) // [아이디, 입장 메시지] 꼴로 temp에 저장한다.
} else { // 유저가 나간 경우는
temp.push([spl[1] , leaveLine]) // [아이디, 퇴장 메시지] 꼴로 temp에 저장한다.
}
}
temp.forEach( list => {
result.push(current[list[0]] + list[1])
//아이디로 최근 닉네임을 객체에서 가져와 입/퇴장 메시지와 조립하여 result에 넣는다.
})
return result //result를 반환
}
오픈채팅을 평소에 많이 사용해봐서(그림방, 코딩방) 메커니즘을 이해하는데에 어려움은 없었다.