반응형
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/42888
문제 풀이 힌트
문제 풀이 코드
function solution(record) {
const answer = [];
const userInfo = {};
//userInfo를 {} 객체로 생성하여 이름과 값 쌍을로 구성
for (let i = 0; i < record.length; i++) {
const [command, uid, nickname] = record[i].split(" ");
//배열을 구조 분해 하여 요소를 각각 개별적인 변수로 접근
if (command === "Enter") {
userInfo[uid] = nickname;
answer.push(`${uid}님이 들어왔습니다.`);
} else if (command === "Leave") {
answer.push(`${uid}님이 나갔습니다.`);
} else if (command === "Change") {
userInfo[uid] = nickname;
}
}
// answer 배열에 있는 메시지 중 유저 아이디를 최신 닉네임으로 변경
for (let i = 0; i < answer.length; i++) {
const uid = answer[i].split("님이")[0];
answer[i] = answer[i].replace(uid, userInfo[uid]);
}
return answer;
}
Only 풀이 코드
function solution(record) {
const answer = [];
const userInfo = {};
for (let i = 0; i < record.length; i++) {
const [command, uid, nickname] = record[i].split(" ");
if (command === "Enter") {
userInfo[uid] = nickname;
answer.push(`${uid}님이 들어왔습니다.`);
} else if (command === "Leave") {
answer.push(`${uid}님이 나갔습니다.`);
} else if (command === "Change") {
userInfo[uid] = nickname;
}
}
for (let i = 0; i < answer.length; i++) {
const uid = answer[i].split("님이")[0];
answer[i] = answer[i].replace(uid, userInfo[uid]);
}
return answer;
}
다른 사람풀이 코드 2
function solution(record) {
let ret = []
const uids = new Map()
record.forEach(entry => {
let [command, uid, nick] = entry.split(' ')
if (command === 'Enter' || command === 'Change') uids.set(uid, nick)
})
record.forEach(entry => {
let [command, uid] = entry.split(' ')
if (command === 'Enter') ret.push(`${uids.get(uid)}님이 들어왔습니다.`)
if (command === 'Leave') ret.push(`${uids.get(uid)}님이 나갔습니다.`)
})
return ret
}
나의 틀린 풀이 코드 (샘플만 맞고, 틀림)
나는 Map을 만들어서 풀었었는데
- 해당 id에 해당하는 값을 가져와서 다시 재할당 하는 것.
- replace 로 값을 설정하지 못하는지...?
사실, 문제 풀이 방법은 잘 생각해냈다.
정답 코드 보니까 Map이 아닌 Obj를 사용했는데, 무슨 차이인지 알고 넘어가야 한다.
음 그리고 이렇게가 순서다.
1. 문제 읽는거 정리
2. 제한 조건
3. 어떻게 풀지
4. 디버깅
function solution(record) {
let result =[];
let userInfo = new Map();
for(let i=0; i<record.length; i++){
let [act, userId, nickName] = record[i].split(' ');
userInfo.set(userId, nickName);
switch (act) {
case 'Enter':
result.push(`${userId}님이 들어왔습니다.`)
break;
case 'Leave':
result.push(`${userId}님이 나갔습니다.`);
break;
case 'Change':
break;
}
}
for(let i=0; i<result.length; i++){
let pickId = result[i].split('님')[0]
let action = result[i].split(' ')[1];
if(action == '들어왔습니다.'){
result[i] = `${userInfo.get(pickId)}님이 들어왔습니다.`
}else{
result[i] = `${userInfo.get(pickId)}님이 나갔습니다.`
}
// console.log(pickId)
// console.log(userInfo.get(pickId), 'check')
// result[i] = (pickId, userInfo.get(pickId))
// console.log(result)
}
return result;
}
//가상 닉네임
//나가고 들어오는거 지켜봄
//닉네임 변경 방법 2가지. 채팅방을 나간후 , 새로운 닉네임으로,,,,, 채팅방 내에서 닉네임 변경
//닉네임 중복 허용
//과거메시지에 이름까지 변경
//최종 메시지를 문자열 배열 형태로 return
//Enter, Leave, Change
//단어: 대문자, 소문자, 숫자
//유저 아이디, 닉네임 길이 1~10
// record 배열 돌면서 나누기
// Enter일때: "들어왔습니다" 출력, Leave일때: "나갔습니다" 출력, Change일때: 해당하는 유저 id의 메시지 이름 변경,
// 실시간으로 유저 아이디에 해당하는 이름이 뭔지 저장을 해야 한다. 객체로 저장 !
//입출력 예시 보면서 내 생각이 맞는지 확인하기
// map에 id랑 이름 set (id가 없다면)
// Leave일 때 id에서 get 이름 가져와서 메이시 출력
// Enter일 때 다시,
//ㅇㅋ 알았다. 메시지는 그냥 나중에 출력해 일단 id 값으로 넣는다.
//그리고 나중에 그 id를 해당 닉네임으로 변경해서 출력.
//들어왔습니다. 나갔습니다만 메시지로 써
//결론)
//들어올 때 메시지 출력(아이디 값으로) + 아이디에 따른 이름 세팅
//나갈 때 메시지 출력 (아이디 값으로 )
//변경할 때 아이디에 따른 이름 세팅
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
프로그래머스: [1차]프렌즈4블록 - javascript(그래프 이동, concat) (0) | 2024.04.13 |
---|---|
프로그래머스: [3차]파일명 정렬 - javascript(정규식 끝판왕) (0) | 2024.04.11 |
프로그래머스: [3차] N진수 게임 - javascript(toString, toUpperCase()) (0) | 2024.04.08 |
프로그래머스: 키패드 누르기 - javasript(구현, Math.abs, 숫자 규칙) (0) | 2024.04.06 |
프로그래머스 : [1차] 비밀지도 - javascript(toString(), padStart()) (0) | 2024.04.05 |