[PS] 프로그래머스(Level2) - 오픈채팅방(KAKAO 2019) - JavaScript
2021.4.29
문제
프로그래머스(Level2) - 오픈채팅방(KAKAO 2019)
문제 링크
코드 및 감상
처음 코드
function solution(record) {
let answer = [];
let user_infos = {};
record.forEach((e)=>{
if(e.substr(0, 5) === "Enter") {
let idx1, idx2;
for(let i = 0; i < e.length; i++) {
if(e[i] === ' ') {
idx1 = i + 1;
break;
}
}
for (let i = idx1; i < e.length; i++) {
if(e[i] === ' ') {
idx2 = i - 1;
break;
}
}
let id = e.substr(idx1, idx2 - idx1 + 1);
let nickname = e.substr(idx2 + 2);
user_infos[id] = nickname;
answer.push(`E ${id}`);
}
else if(e.substr(0, 5) === "Leave") {
let idx;
for(let i = 0; i < e.length; i++) {
if(e[i] === ' ') {
idx = i + 1;
break;
}
}
const id = e.substr(idx);
answer.push(`L ${id}`);
}
else { // change
let idx1, idx2;
for(let i = 0; i < e.length; i++) {
if(e[i] === ' ') {
idx1 = i + 1;
break;
}
}
for (let i = idx1; i < e.length; i++) {
if(e[i] === ' ') {
idx2 = i - 1;
break;
}
}
let id = e.substr(idx1, idx2 - idx1 + 1);
let nickname = e.substr(idx2 + 2);
user_infos[id] = nickname;
}
});
answer = answer.map((e) => {
const id = e.substr(2);
if(e[0] === 'E') {
return `${user_infos[id]}님이 들어왔습니다.`;
}
else {
return `${user_infos[id]}님이 나갔습니다.`;
}
});
return answer;
}
console.log(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]));
str.substr()
, arr.forEach()
, arr.map()
-
풀이는 바로 떠올랐지만, js에 익숙치않아 문자열에서 id와 nickname을 어떻게 파싱할지가 생각이 안났다.
-
그래서 그냥 원시적으로 for문을 돌며 두 space 위치를 찾는 방식으로 했다..
-
풀고나서 다른 사람의 js풀이를 찾아보니 str.split()
을 썼어야 했다.!!
-
입력 배열의 최대크기가 10만이었는데,
-
시간초과가 안나는걸 보고, js object에서 key찾을 때 드는 time complexity을 찾아보니 O(1)
이었다.! (내부에서 hash table을 이용. 설명 링크)
-
그리고 순간 str.substr()에서 인자를 하나만 넣었을 때 length라고 착각했다. (이것때문에 시간 좀 날림..)
string.prototype.substr(pos[, len])
이다.
개선된 코드
function solution(record) {
const answer = [];
const tmp = [];
const id_to_nick = {};
record.forEach((e)=>{
const [behavior, id, nickname] = e.split(' ');
if(behavior !== "Change") {
tmp.push([behavior, id]);
}
if(nickname) {
id_to_nick[id] = nickname;
}
});
tmp.forEach((e) => {
const [behavior, id] = e;
if(behavior === "Enter")
answer.push(`${id_to_nick[id]}님이 들어왔습니다.`);
else
answer.push(`${id_to_nick[id]}님이 나갔습니다.`);
});
return answer;
}
console.log(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]));
str.split()
이용
- destructuring (구조분해할당) 이용
Author And Source
이 문제에 관하여([PS] 프로그래머스(Level2) - 오픈채팅방(KAKAO 2019) - JavaScript), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@hyeonseop/프로그래머스Level2-오픈채팅방KAKAO-2019
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
function solution(record) {
let answer = [];
let user_infos = {};
record.forEach((e)=>{
if(e.substr(0, 5) === "Enter") {
let idx1, idx2;
for(let i = 0; i < e.length; i++) {
if(e[i] === ' ') {
idx1 = i + 1;
break;
}
}
for (let i = idx1; i < e.length; i++) {
if(e[i] === ' ') {
idx2 = i - 1;
break;
}
}
let id = e.substr(idx1, idx2 - idx1 + 1);
let nickname = e.substr(idx2 + 2);
user_infos[id] = nickname;
answer.push(`E ${id}`);
}
else if(e.substr(0, 5) === "Leave") {
let idx;
for(let i = 0; i < e.length; i++) {
if(e[i] === ' ') {
idx = i + 1;
break;
}
}
const id = e.substr(idx);
answer.push(`L ${id}`);
}
else { // change
let idx1, idx2;
for(let i = 0; i < e.length; i++) {
if(e[i] === ' ') {
idx1 = i + 1;
break;
}
}
for (let i = idx1; i < e.length; i++) {
if(e[i] === ' ') {
idx2 = i - 1;
break;
}
}
let id = e.substr(idx1, idx2 - idx1 + 1);
let nickname = e.substr(idx2 + 2);
user_infos[id] = nickname;
}
});
answer = answer.map((e) => {
const id = e.substr(2);
if(e[0] === 'E') {
return `${user_infos[id]}님이 들어왔습니다.`;
}
else {
return `${user_infos[id]}님이 나갔습니다.`;
}
});
return answer;
}
console.log(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]));
str.substr()
, arr.forEach()
, arr.map()
풀이는 바로 떠올랐지만, js에 익숙치않아 문자열에서 id와 nickname을 어떻게 파싱할지가 생각이 안났다.
그래서 그냥 원시적으로 for문을 돌며 두 space 위치를 찾는 방식으로 했다..
풀고나서 다른 사람의 js풀이를 찾아보니 str.split()
을 썼어야 했다.!!
입력 배열의 최대크기가 10만이었는데,
시간초과가 안나는걸 보고, js object에서 key찾을 때 드는 time complexity을 찾아보니 O(1)
이었다.! (내부에서 hash table을 이용. 설명 링크)
그리고 순간 str.substr()에서 인자를 하나만 넣었을 때 length라고 착각했다. (이것때문에 시간 좀 날림..)
string.prototype.substr(pos[, len])
이다.
function solution(record) {
const answer = [];
const tmp = [];
const id_to_nick = {};
record.forEach((e)=>{
const [behavior, id, nickname] = e.split(' ');
if(behavior !== "Change") {
tmp.push([behavior, id]);
}
if(nickname) {
id_to_nick[id] = nickname;
}
});
tmp.forEach((e) => {
const [behavior, id] = e;
if(behavior === "Enter")
answer.push(`${id_to_nick[id]}님이 들어왔습니다.`);
else
answer.push(`${id_to_nick[id]}님이 나갔습니다.`);
});
return answer;
}
console.log(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]));
str.split()
이용Author And Source
이 문제에 관하여([PS] 프로그래머스(Level2) - 오픈채팅방(KAKAO 2019) - JavaScript), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyeonseop/프로그래머스Level2-오픈채팅방KAKAO-2019저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)