오픈채팅방

Algorithm 2019. 8. 19. 16:14
반응형

http://tech.kakao.com/2018/09/21/kakao-blind-recruitment-for2019-round-1/

 

2019 카카오 신입 공채 1차 코딩 테스트 문제 해설

작년에 이어 올해도 블라인드 전형으로 카카오 개발 신입 공채가 시작되었습니다! 그 첫 번째 관문으로 1차 온라인 코딩 테스트가 지난 9월 15일(토) 오후 2시부터 7시까지 5시간 동안 치러졌는데요. 지원자분들 만큼이나 준비위원들도 테스트가 문제없이, 공정하게 치러질 수 있도록 많은 준비를 했고 두근 거리는 마음으로 끝까지 온라인 테스트를 모니터링했답니다. 문제는 작년과 비슷하게 구현 문제 위주로 쉬운 난이도에서 어려운 난이도 순으로 풀 수 있도록 차례대

tech.kakao.com

https://www.welcomekakao.com/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방 | 프로그래머스

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. [닉네임]님이 들어왔습니다. 채팅방에서 누군가 나가면 다음 메시지가 출력된다. [닉네임]님이 나갔습니다. 채팅

www.welcomekakao.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
 
namespace _07
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] arr = {"Enter uid1234 Muzi"
                            "Enter uid4567 Prodo",
                            "Leave uid1234",
                            "Enter uid1234 Prodo",
                            "Change uid4567 Ryan"};
 
            // string[] arr = { "Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"};
            var p3 = new Problem3();
            p3.solution(arr);
        }
    }
 
    public class Problem3{
 
        List<User> users = new List<User>();
        List<Command> commands = new List<Command>();
 
        public class User{
            public string Uid {get; set;}
            public string NickName {get; set;}
            public User(string uid, string nickName){
                this.Uid = uid;
                this.NickName = nickName;
            }
        }
 
        public class Command{
            public string Cmd{get; set;}
            public string Uid{get; set;}
            public string NickName {get; set;}
            public Command(string cmd, string uid, string nickName = ""){
                this.Cmd = cmd;
                this.Uid = uid;
                this.NickName = nickName;
            }
        }
 
        public void solution(string[] strArr){
            foreach(var str in strArr){
                
                //유저 생성 
                var arr = str.Split(' ');
                var cmd = arr[0];
                var uid = arr[1];
                string nickName;
                
                try{
                    nickName = arr[2];
                }catch{
                    nickName = "";
                }
                
 
                if(!string.IsNullOrEmpty(nickName)){
                    if(!this.users.Any(x=>x.Uid == uid)){
                        var user = new User(uid, nickName);
                        this.users.Add(user);    
                    }
                }
 
                //명령어 생성 
                Command command;
                if(!string.IsNullOrEmpty(nickName)){
                    command = new Command(cmd, uid, nickName);
                }else{
                    command = new Command(cmd, uid);
                }
                
                this.commands.Add(command);
 
            }
 
            this.DisplayBuffer();
 
            foreach(var command in this.commands){
                var user = this.users.Find(x=>x.Uid == command.Uid);
                if(command.Cmd == "Enter"){
                    Console.WriteLine(user.NickName + "님이 들어왔습니다.");
                }else if(command.Cmd == "Leave"){
                    Console.WriteLine(user.NickName + "님이 나갔습니다.");
                }
            }
 
        }
 
        private void DisplayBuffer(){
            foreach(var command in this.commands){
                
                var user = this.users.Find(x=>x.Uid == command.Uid);
 
                switch(command.Cmd){
                    case "Enter":
                    {
                        if(user!= null){
                            if(user.NickName != command.NickName){
                                user.NickName = command.NickName;
                            }
                        }
                        
                    }
                    break;
 
                    case "Change":
                    {
                        if(user!= null){
                            user.NickName = command.NickName;
                        }
                    }
                    break;
                }
            }
        }
    }
}
 
 

 

 

 

자바스크립트 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
let users = [];
let events = [];
function solution(record) {
     var answer = [];
 
    record.forEach((str)=>{
        var arrInput = str.split(' ');
    
        let user = {};
        let event = {};
        user.uid = arrInput[1];
    
        if(arrInput[2!== undefined){
            user.nickName = arrInput[2];
        }else{
            user.nickName = "";
        }
    
        var foundUser = users.find(x=>x.uid === user.uid);
        if(foundUser === undefined){
            users.push(user);
        }
    
        event.cmd = arrInput[0];
        event.uid = user.uid;
        event.nickName = user.nickName;
        events.push(event);
 
        if(event.cmd === "Enter" || event.cmd === "Change"){
            let user = users.find(x=>x.uid === event.uid);
            if(user.nickName !== event.nickName){
                user.nickName = event.nickName;
            }
        }
 
    });
    
    events.forEach(event => {
        var user = users.find(x=>x.uid === event.uid);
        if(event.cmd === "Enter"){
            answer.push(user.nickName + "님이 들어왔습니다.");
        }else if(event.cmd === "Leave"){
            answer.push(user.nickName + "님이 나갔습니다.");
        }
    });
    
    return answer;
}
 
 

테스트 25부터 시간 초과가 계속 뜬다...

 

...더보기

 

김아라님

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function solution(record) {
    const userInfo = {};
    const action = [];
    const stateMapping = {
        'Enter''님이 들어왔습니다.',
        'Leave''님이 나갔습니다.'
    }
 
    record.forEach((v) => {
        const [state, id, nick] = v.split(' ');
 
        if(state !== "Change") {
            action.push([state, id]);
        }
 
        if(nick) {
            userInfo[id] = nick;
        }
    })
 
    return action.map(([state, uid]) => {
        return `${userInfo[uid]}${stateMapping[state]}`;    
    })
}
 
 

 

SemteulGaram , 이주형 , 장봉기 , 양승모 , 장진호 외 2 명

1
2
3
4
5
function solution(record) {
    var nick = {}, a = record.map(v => v.split(' '))
    a.slice().reverse().forEach(v => { if (v[2&& !nick[v[1]]) { nick[v[1]] = v[2] } })
    return a.filter(v => { return v[0!== 'Change' }).map(v => { return v[0=== 'Enter' ? nick[v[1]] + '님이 들어왔습니다.' : nick[v[1]] + '님이 나갔습니다.' })
}
 
 

 

 

 

이화섭 , SemteulGaram , 혜성 , Wonwoo Lee , DONGKEON KIM 외 1 명

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
}
 
 
 

 

 

 

홍종화님

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function solution(arr) {
  const name = [];
  const print = [];
  for (let val of arr) {
    let strArr = val.split(" ");
    if (strArr[0=== "Enter") {
      name[strArr[1]] = strArr[2];
    } else if (strArr[0=== "Change") {
      name[strArr[1]] = strArr[2];
    }
  }
 
  for (let val of arr) {
    let strArr = val.split(" ");
    if (strArr[0=== "Change"continue;
    else if (strArr[0=== "Enter") {
      print.push(`${name[strArr[1]]}님이 들어왔습니다.`);
    } else {
      print.push(`${name[strArr[1]]}님이 나갔습니다.`);
    }
  }
 
  return print;
}
 
solution([
  "Enter uid1234 Muzi",
  "Enter uid4567 Prodo",
  "Leave uid1234",
  "Enter uid1234 Prodo",
  "Change uid4567 Ryan"
]);
// 1번문제 16분컷
 
 
 

 

 

이원석님 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function solution(record) {
  let c = record.filter(ele => /Change|Enter/g.test(ele))
 
  let userArr = []
  let resArr = []
 
  let test = c.reduce((prev, next) => {
    let arr = next.split(" ")
    prev[arr[1]] = arr[2]
    return prev
  }, {})
 
    let eleArr = ele.split(" ");
    if( eleArr[0== 'Enter'){
      resArr.push(`${test[eleArr[1]]}님이 들어왔습니다.`) 
    }else if(eleArr[0== 'Leave'){
      resArr.push(`${test[eleArr[1]]}님이 나갔습니다.`)
    }
  })
  return resArr
}
 
 
 

 

김바한솔님 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function solution(record) {
    const splitRecord = [];
    const uidNickname = {};
    var answer = [];
    record.forEach(r => {
        const s = r.split(' ');
        splitRecord.push([s[0], s[1]])
        if(s[2]) {
            uidNickname[s[1]] = s[2];
        }
    });
    splitRecord.forEach(r => {
        let msg;
        if(r[0=== 'Enter') {
            msg = '님이 들어왔습니다.'
        }
        else if(r[0=== 'Leave') {
            msg =  '님이 나갔습니다.'
        }
        if(msg) {
            answer.push(`${uidNickname[r[1]]}${msg}`);
        }
    })
 
    return answer;
}
 
 

 

 

 

배지원님 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function solution(record) {
    const users = {}
    const actionType = {
        Enter: '님이 들어왔습니다.',
        Leave: '님이 나갔습니다.'
    }
 
    return record
    .filter(v => {
        const [action, id, nickname] = v.split(' ')
        if (action !== 'Leave') users[id] = nickname
        return action !== 'Change'
    }).reduce((prev, curr) => {
        const [action, id] = curr.split(' ')
        prev.push(users[id] + actionType[action])
        return prev
    }, [])
}
 
 

 

 

 

BYUNGI님

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function solution(record) {
    const {users, answers} = parseRecord(record)
 
    return answers.map(({act, uid}) => ({
        'Enter': `${users[uid]}님이 들어왔습니다.`,
        'Leave': `${users[uid]}님이 나갔습니다.`,
    })[act]);
}
 
function parseRecord(record){
    const users = Object.create(null)
    const answers = []
 
    record.map(row => row.split(' ')).forEach(([act, uid, nick])=>{
        if(['Enter','Change'].includes(act)) users[uid] = nick
        if(['Enter','Leave'].includes(act)) answers.push({act, uid})
    })
 
    return {users, answers}
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

 

고경운님 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const solution = (records) => {
  const answer = [];
  const map = new Map();
 
    const [ type, id, nickname ] = record.split(' ');
    if (type === 'Enter' || type === 'Change'map.set(id, nickname);
    if (type === 'Enter' || type === 'Leave'answer.push({ id, type });
  });
 
  return answer.map(item => {
    switch (item.type) {
      case 'Enter':
        return `${map.get(item.id)}님이 들어왔습니다.`;
        break;
      case 'Leave':
        return `${map.get(item.id)}님이 나갔습니다.`;
        break;
    }
  });
};
 
 

 

 

 

고경운 , you , OREO

 

1
2
3
4
5
6
7
8
9
10
11
12
const solution = (record) => {
  const answer = [];
  const map = new Map();
 
    const [ type, id, nickname ] = entry.split(' ');
    if (type === 'Enter' || type === 'Change'map.set(id, nickname);
    if (type === 'Enter' || type === 'Leave'answer.push({ id, type });
  });
 
  return answer.map(item => `${map.get(item.id)}님이 ${item.type === 'Enter' ? '들어왔습니다' : '나갔습니다'}.`);
};
 
 
반응형

'Algorithm' 카테고리의 다른 글

완주하지 못한 선수  (0) 2019.08.20
[js] 소수 구하기  (0) 2019.08.20
Prime Number  (0) 2019.08.16
[Lv.2] 큰수 만들기 (탐욕법)  (0) 2019.08.16
[Lv.2] 소수 찾기  (0) 2019.08.16
: