알고리즘 문제 풀기

프로그래머스: 오픈채팅방 - javascript(replace, Map, switch)

Fo_rdang 2024. 4. 9. 12:19
반응형

문제 출처 

https://school.programmers.co.kr/learn/courses/30/lessons/42888

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이 힌트 

문제 풀이 코드 

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를 해당 닉네임으로 변경해서 출력. 
//들어왔습니다. 나갔습니다만 메시지로 써 

//결론) 
//들어올 때 메시지 출력(아이디 값으로) + 아이디에 따른 이름 세팅 
//나갈 때 메시지 출력 (아이디 값으로 )
//변경할 때 아이디에 따른 이름 세팅
반응형