[JS][프로그래머스 -LEVEL 2 - 오픈채팅방]

정대만·2023년 7월 4일

코딩테스트

목록 보기
15/51
post-thumbnail

맞긴 맞는데 시간 복잡도가 너무 커서 다른 사람 코드를 참조 하였다.

처음 생각

log :{ 아이디 : [들어왔습니다,1] ,[나갔습니다,2] }
nickname:{ 아이디 : 'muxiz' , 아이디, ' prodo'}

처음에는 다 object 형식으로 만들어야된다고생각을 했었다
아이디를 기준으로 log 기록을 만들고 마지막에 아이디를 닉네임이름으로 변경시키고
sort 를 통해 순서를 바꾸면 된다고 생각을 했었다.

문제점

  • [아이디, 들어왔습니다. 1] 이런식으로 변경하기 위해선
    오브젝트를 Object.entires() 을 사용해서 바꾸면 [ 아이디 ,[ log기록,1] ,[log기록,2]]
    이런식으로 이상하게 나와 결국에는 내부 for 문을 또 돌려서 추가해주는 번거로운 작업이 발생하였다. 사실 여기서 잘못된다는것을 알아서 다른방법으로 풀어야됬는데 생각이 안났다.

  • sort 시간 복잡도 증가

function solution(record) {
    var answer = [];
    //1. 들어왔으면 아이디 고정 object 형식으로 고정 아이디 : 닉네임 식으로 고정
    // change 한 경우 :닉네임 수정 >  들어온 경우 일렬로 수정해야되기 때문에 
    //  배열로 저장해놓을끼.. 근데 배열 find 하나밖에 못칫는디...... 찾을려면 엄청 오래걸리고
    //  uld1234: ['들어왔습니다.',1] ['나갔습니다.',2]
   //   uid4567:[prodo,IN,2]
    // 로그기록과 닉네임을 따로 빼서  for 문 끝나면 > key 값을 닉네임으로 바꿔줌 object assign 함 ,
    // sort 함 
    var log={
        
    }
    var nick={
        
    }
 
    for(var i=0; i<record.length; i++){

        var [oper,id,nickname]=record[i].split(' ');
        if(oper=='Enter'|| oper=='Change'){
            nick[id]=nickname;
        }
        if(oper=='Enter'){
            if(!log[id]){
                log[id]=[['들어왔습니다.',i]]
            }
            else{
                log[id].push(['들어왔습니다.',i])
            }
        }
        if(oper=='Leave'){
              if(!log[id]){
                log[id]=[['나갔습니다.',i]]
            }
            else{
                log[id].push(['나갔습니다.',i])
            }
        }
    }
    var new_return=[];
    
    //새로운 객체로 형성 해야될듯요 
    var new_obj=[];
   for(var name in log){
         //console.log(log[name],'이름')
       for(var i=0; i<log[name].length; i++){
           new_obj.push([nick[name],...log[name][i]])
       }
   }
  new_obj.sort((a,b)=> a[2]-b[2]).map((el)=>{
      new_return.push(el[0]+'님이 '+el[1])
  });
    //console.log(new_return)
  
    
    
    return new_return;
}

결국은 맞앗지만 시간이 너무 오래걸리는것을 볼수 있다.

해결방안

다른 사람 코드를 보니
log :{ } 이런식으로 두는게 아닌 배열 형태를 이용해서 만든다. 이때 닉네임을 넣지 않고
아이디+ '들어왓습니다' 이런식으로 넣은다음 다시 전처리를 통해 답을 도출한것을 볼수 있다.

nickname 을 object 형식으로 하는것은 같았다..

function solution(record) {
    var log=[];
    
    var nick={
        
    }

    for(var i=0; i<record.length; i++){

        var [oper,id,nickname]=record[i].split(' ');
        if( oper=='Change'){
            nick[id]=nickname;
        }
        if(oper=='Enter'){
           log.push([id,'IN'])
             nick[id]=nickname;
        }
        if(oper=='Leave'){
          log.push([id,'Leave'])
        }
    }
    

    for(var i=0; i<log.length; i++){
        var [id,here]=log[i];
        
         
        if(here=='IN'){
            log[i]=`${nick[id]}님이 들어왔습니다.`
        }
    else if(here=='Leave'){
           log[i]=`${nick[id]}님이 나갔습니다.`
      }
    }
   return (log)
}
profile
안녕하세요

0개의 댓글