[CodingTest] 2019 카카오 신입 공채 1차 - 1번 오픈채팅방 문제 with Javascript


오픈채팅방

  • 문제 바로가기 링크
  • 카카오의 설명 블로그

    나의 답안

    function solution(record) {
      let accounts = [], events = [], answer = [];
        
      function setEnterProcess(message, userId, nickName) {
          const findAccountByUserId = accounts.find(a => a.userId == userId)
    
          if(findAccountByUserId && findAccountByUserId.nickName !== nickName) findAccountByUserId.nickName = nickName;
          else accounts.push({userId, nickName});
            
          events.push({message, userId});
      }
        
      function setChangeProcess(userId, nickName) {
          const findAccountByUserId = accounts.find(a => a.userId == userId)
          findAccountByUserId.nickName = nickName
      }
        
      function setLeaveProcess(message, userId) { 
        events.push({message, userId}) 
      }
    
      record.map(r => {
          const msgArray = r.split(" "),
                message = msgArray[0],
                userId = msgArray[1],
                nickName = msgArray[2];
          if(message == "Enter") setEnterProcess(message, userId, nickName);
          else if(message == "Change") setChangeProcess(userId, nickName);
          else if(message == "Leave") setLeaveProcess(message, userId);
      })
        
      events.map(e => {
          const findAccountByUserId = accounts.find(a => a.userId == e.userId)
          if(e.message == "Enter") answer.push(`${findAccountByUserId.nickName}님이 들어왔습니다.`)
          else if(e.message == "Leave") answer.push(`${findAccountByUserId.nickName}님이 나갔습니다.`)
      })
        
      return answer;
    }
    


    테스트

  • Mocha 라이브러리 사용.

    test.js

    const assert = require('assert');
    describe('test1', () => {
    describe('#연결배열', () => {
      it('문제에서 제시한 테스트', () => {
        assert.equal(
          JSON.stringify(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"])),
          JSON.stringify(["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."])
        );
      });
    
      it('기존 테스트에 추가한 로직을 추가한 테스트', () => {
        assert.equal(
          JSON.stringify(solution(
            [
              "Enter uid1234 Muzi", 
              "Enter uid4567 Prodo",
              "Leave uid1234",
              "Enter uid1234 Prodo",
              "Change uid4567 Ryan",
              "Leave uid1234",
              "Enter uid9990 Dave",
              "Change uid9990 Kean",
              "Enter uid1234 Jane",
            ]
          )),
          JSON.stringify([
            "Jane님이 들어왔습니다.", 
            "Ryan님이 들어왔습니다.", 
            "Jane님이 나갔습니다.", 
            "Jane님이 들어왔습니다.",
            "Jane님이 나갔습니다.",  
            "Kean님이 들어왔습니다.", 
            "Jane님이 들어왔습니다."
          ])
        );
      });
    });
    });
    


느낀점

처음엔 events와 accounts를 같은 곳에 담고 관리하려고 했다.

[
  {
    {message: "Enter", userId: "uid1234", nickName: "Muzi"},
    {message: "Enter", userId: "uid4567", nickName: "Prodo"},
    ....
  }
]

그러다보니 한 유저가 닉네임을 변경할때마다 모든 객체들을 탐색해야했다.
문제를 풀고 카카오의 해설 을 보니 “두 연결배열에 각각 accouts와 events에 담아 관리하면 쉽다”는 해설을 보고 코드를 다시 짰다.
해설을 보고나니 너무 간단해 허탈했다. 아직 갈길이 먼 것 같다.





2023

Flutter 맛보기 1

3 분 소요

직방 기술지원팀 기술공유 세미나 중 플러터를 소개한 내용입니다

Back to Top ↑

2022

Back to Top ↑

2019

[Tutorial] Storybook과 Bit을 활용한 UI 컴포넌트 관리(Workflow)

1 분 소요

회사에서 프론트엔드 개발원칙을 SFC(Single File Component)에서 UI 컴포넌트를 기준으로 CDD(Component Driven Development)를 진행하려고 한다. 그래서 체계적으로 관리하기위해 Storybook과 Bit을 도입해보고자 한다. 각각의 역할은 ...

[Workflow] 프론트엔드 개발조직을 위한 워크플로 설계

2 분 소요

작성 배경 회사의 작업구조를 페이지 중심 개발에서 UI 컴포넌트 중심 개발로 변경하면서 Workflow를 개선할만한 환경을 구성해야했다. 폐쇄망 기반에서 개발자간 UI 명세서 역할을 할 수 있는 Storybook과 그것을 공유할 Verdaccio라는 구축형 NPM Pri...

[ESlint & Prettier] 개발 관습 설정 in Visual Studio

1 분 소요

회사 프로젝트를 작업하기 전 프론트엔드 개발자들 간의 코드 규칙을 Eslint와 Prettier 설정을 맞춰 관리해가는 방향을 정했다. 아직 협업을 할 경우는 없지만 미래에 인수인계 받거나 협업을 진행할 경우 코드관습이 달라 고생할 경우를 대비하기로 했다. 설정은 작업을 진행하며 ...

[CodingTest] 2019-10-26 SQL문제

최대 1 분 소요

공부겸 코딩테스트 사이트에서 토요일 오전 10시에 백엔드 포지션 테스트를 해준다기에 참여해봤다. SQL문제가 나왔는데 더 좋은 답이 있는것 같아 나중에 기록해두고 수정해보기로 한다.

[CodingTest] 피보나치 수열

1 분 소요

문제 : 피보나치 수열 제 1항부터 입력한 자연수(N)까지의 피보나치 수열 항들의 합을 구하여라.

[Syntax] 새로 알게된 파이썬 문법 정리

최대 1 분 소요

chaning comparison 파이썬은 chaning comparison이라는 신기한 문법이 있다. 참고 if a < b and b < c : (...) 라는 구문이 if a < b < c : (...) 으로 연산된다. 직관적인 문법이 인상적. ...

[DataType] Map & Set

최대 1 분 소요

Set vs Array - 관련기사 Set 유일값들의 배열이 필요할때(distinct) 집합의 개념이 필요할때(차집합, 교집합 등등 자체 메서드들이 많음.) index가 필요 없을때 Array에서 중복값을 없앨때 => ...

Back to Top ↑

2018

SGIS-shpToGeojson

1 분 소요

SGIS에서 받은 지도데이터(.shp)를 geojson으로 변경하는 작업 내용

Back to Top ↑