From fea533cef5e39dc3d3c8e0a6b161baa41a3c26ca Mon Sep 17 00:00:00 2001
From: chaerin <70943835+chaerin-dev@users.noreply.github.com>
Date: Fri, 6 May 2022 19:55:15 +0900
Subject: [PATCH 1/5] =?UTF-8?q?Add=20=EB=82=B4=EC=A0=81.js?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 "level-1/\353\202\264\354\240\201.js" | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git "a/level-1/\353\202\264\354\240\201.js" "b/level-1/\353\202\264\354\240\201.js"
index 38f25e9..81e808a 100644
--- "a/level-1/\353\202\264\354\240\201.js"
+++ "b/level-1/\353\202\264\354\240\201.js"
@@ -33,4 +33,9 @@ function solution(a, b) {
         answer += (a[i] * b[i]) // a[i]와 b[i]를 곱한다.
     }
     return answer;
-}
\ No newline at end of file
+}
+
+//정답 5 - chaerin-dev
+function solution(a, b) {
+  return a.reduce((acc, e, i) => acc + e * b[i], 0);
+}

From abb17ce95540f2d7cde6ab1fab36559f6fcd0f80 Mon Sep 17 00:00:00 2001
From: chaerin <70943835+chaerin-dev@users.noreply.github.com>
Date: Fri, 6 May 2022 19:56:21 +0900
Subject: [PATCH 2/5] =?UTF-8?q?Add=20=EC=9D=8C=EC=96=91-=EB=8D=94=ED=95=98?=
 =?UTF-8?q?=EA=B8=B0.js?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...6\221-\353\215\224\355\225\230\352\270\260.js" | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git "a/level-1/\354\235\214\354\226\221-\353\215\224\355\225\230\352\270\260.js" "b/level-1/\354\235\214\354\226\221-\353\215\224\355\225\230\352\270\260.js"
index 4f4e26a..59dc770 100644
--- "a/level-1/\354\235\214\354\226\221-\353\215\224\355\225\230\352\270\260.js"
+++ "b/level-1/\354\235\214\354\226\221-\353\215\224\355\225\230\352\270\260.js"
@@ -51,4 +51,19 @@ function solution(absolutes, signs) {
         answer += absolute;
     })
     return answer;
+}
+
+// 정답 6 - chaerin-dev
+function solution(absolutes, signs) {
+  // 연산 결과를 저장할 변수
+  let result = 0;
+  // signs의 각 요소에 대해
+  signs.forEach((e, i) => {
+    // 요소가 true이면 result값에 같은 인덱스의 absolutes 요소를 더해줌
+    if (e) result += absolutes[i];
+    // 요소가 false이면 result값에 같은 인덱스의 absolutes 요소를 빼줌
+    else result -= absolutes[i];
+  });
+  // result 반환
+  return result;
 }
\ No newline at end of file

From 334124264a20ea818809daaeff49c2ffdc222b27 Mon Sep 17 00:00:00 2001
From: chaerin <70943835+chaerin-dev@users.noreply.github.com>
Date: Fri, 6 May 2022 19:57:16 +0900
Subject: [PATCH 3/5] =?UTF-8?q?Add=20=ED=82=A4=ED=8C=A8=EB=93=9C-=EB=88=84?=
 =?UTF-8?q?=EB=A5=B4=EA=B8=B0.js?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...4-\353\210\204\353\245\264\352\270\260.js" | 69 +++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git "a/level-1/\355\202\244\355\214\250\353\223\234-\353\210\204\353\245\264\352\270\260.js" "b/level-1/\355\202\244\355\214\250\353\223\234-\353\210\204\353\245\264\352\270\260.js"
index cba20ed..e7600cb 100644
--- "a/level-1/\355\202\244\355\214\250\353\223\234-\353\210\204\353\245\264\352\270\260.js"
+++ "b/level-1/\355\202\244\355\214\250\353\223\234-\353\210\204\353\245\264\352\270\260.js"
@@ -52,3 +52,72 @@ function numToLocation(num) {
 function distanceBtwLocation(a, b) {
   return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
 }
+
+//정답 2 - chaerin-dev
+function solution(numbers, hand) {
+  // 키패드를 4행 3열의 이차원 배열이라고 생각
+
+  // leftRow, leftCol: 왼손의 현재 위치
+  let [leftRow, leftCol] = [3, 0];
+  // rightRow, rightCol: 오른손의 현재 위치
+  let [rightRow, rightCol] = [3, 2];
+  // 각 번호를 누른 엄지손가락이 어느 손인지 저장할 문자열
+  let result = "";
+
+  // 눌러야할 각 번호가
+  numbers.forEach((e) => {
+    // 1/4/7이면 왼손으로 눌러야하므로
+    if (e === 1 || e === 4 || e === 7) {
+      // 왼손의 위치 업데이트
+      [leftRow, leftCol] = [Math.floor((e - 1) / 3), 0];
+      // result 문자열에 "L" 이어붙여줌
+      result += "L";
+    }
+
+    // 3/6/9이면 오른손으로 눌러야하므로
+    else if (e === 3 || e === 6 || e === 9) {
+      // 오른손의 위치 업데이트
+      [rightRow, rightCol] = [Math.floor((e - 1) / 3), 2];
+      // result 문자열에 "R" 이어붙여줌
+      result += "R";
+    }
+
+    // 2/5/8/0이면
+    else {
+      // 번호 위치 계산의 편의를 위해 눌러야 할 번호가 0일 경우 11로 바꿔줌
+      if (e === 0) e = 11;
+
+      // leftRow, leftCol: 다음에 눌러야 할 번호의 위치
+      let [nextRow, nextCol] = [Math.floor((e - 1) / 3), 1];
+      // leftDistance: 현재 왼손의 위치와 다음에 눌러야 할 번호의 위치 사이의 거리
+      let leftDistance =
+        Math.abs(leftRow - nextRow) + Math.abs(leftCol - nextCol);
+      // rightDistance: 현재 오른손의 위치와 다음에 눌러야 할 번호의 위치 사이의 거리
+      let rightDistance =
+        Math.abs(rightRow - nextRow) + Math.abs(rightCol - nextCol);
+
+      // 왼손이 다음에 눌러야 할 번호의 위치와 더 가깝거나, 두 손의 거리가 같으면서 왼손잡이라면 왼손으로 눌러야하므로
+      if (
+        leftDistance < rightDistance ||
+        (leftDistance == rightDistance && hand === "left")
+      ) {
+        // 왼손의 위치 업데이트
+        [leftRow, leftCol] = [nextRow, nextCol];
+        // result 문자열에 "L" 이어붙여줌
+        result += "L";
+      }
+
+      // 오른손이 다음에 눌러야 할 번호의 위치와 더 가깝거나, 두 손의 거리가 같으면서 오른손잡이라며 오른손으로 눌러야하므로
+      else {
+        // 오른손의 위치 업데이트
+        [rightRow, rightCol] = [nextRow, nextCol];
+        // reuslt 문자열에 "R" 이어붙여줌
+        result += "R";
+      }
+    }
+  });
+
+  // result 문자열 반환
+  return result;
+}
+

From 59032a41a208aeac035b5f2f763ed2b2ad851732 Mon Sep 17 00:00:00 2001
From: chaerin <70943835+chaerin-dev@users.noreply.github.com>
Date: Fri, 6 May 2022 19:58:16 +0900
Subject: [PATCH 4/5] =?UTF-8?q?Add=20=EB=AC=B8=EC=9E=90=EC=97=B4-=EC=95=95?=
 =?UTF-8?q?=EC=B6=95.js?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...0\354\227\264-\354\225\225\354\266\225.js" | 47 ++++++++++++++++++-
 1 file changed, 46 insertions(+), 1 deletion(-)

diff --git "a/level-2/\353\254\270\354\236\220\354\227\264-\354\225\225\354\266\225.js" "b/level-2/\353\254\270\354\236\220\354\227\264-\354\225\225\354\266\225.js"
index 3b5cd55..05381fc 100644
--- "a/level-2/\353\254\270\354\236\220\354\227\264-\354\225\225\354\266\225.js"
+++ "b/level-2/\353\254\270\354\236\220\354\227\264-\354\225\225\354\266\225.js"
@@ -23,4 +23,49 @@ function compressedString(str, unitNum) {
         }
     }
     return result.join('')
-}
\ No newline at end of file
+}
+
+//정답 2 - chaerin-dev
+function solution(s) {
+  // len: 압축 전 문자열 길이
+  const len = s.length;
+  // shortenLen: 압축 후 문자열 길이의 최솟값을 저장할 변수(압축 전 문자열 길이로 초기화)
+  let shortenLen = len;
+
+  // 문자열을 1개 단위, 2개 단위, ... 문자열 길이의 절반 단위로 잘라가며 압축 수행
+  for (let i = 1; i <= len / 2; i++) {
+    // cnt: 단위가 반복되는 횟수를 카운트할 변수
+    let cnt = 1;
+    // temp: 현재 단위 문자열을 임시로 저장해둘 변수
+    let temp = s.slice(0, i);
+    // shhortenS: 압축 후 문자열을 저장할 변수
+    let shortenS = "";
+
+    // 문자열을 i개 단위로 잘라가며 현재 단위 문자열과 일치하는지 판단
+    for (let j = i; j < len; j += i) {
+      // 현재 단위 문자열과 일치하면 단위가 반복되는 횟수 1 증가
+      if (temp === s.slice(j, j + i)) cnt++;
+      // 현재 단위 문자열과 일치하지 않으면
+      else {
+        // 압축 후 문자열에 단위가 반복되는 횟수와 단위를 이어붙이고
+        if (cnt === 1) shortenS += temp;
+        else shortenS += cnt + temp;
+
+        // 단위가 반복되는 횟수는 다시 1로 초기화
+        cnt = 1;
+        // 현재 단위 문자열 업데이트
+        temp = s.slice(j, j + i);
+      }
+    }
+
+    // 반복이 끝난 후 마지막으로 고려했던 단위 문자열도 압축 후 문자열에 이어붙여줘야 함
+    if (cnt === 1) shortenS += temp;
+    else shortenS += cnt + temp;
+
+    // 압축 후 문자열 길이의 최솟값 업데이트
+    shortenLen = Math.min(shortenLen, shortenS.length);
+  }
+
+  // 압축 후 문자열 길이의 최솟값 반환
+  return shortenLen;
+}

From 7be050ce95bd80fb329ca0499b2e3e4a449d58be Mon Sep 17 00:00:00 2001
From: chaerin <70943835+chaerin-dev@users.noreply.github.com>
Date: Fri, 6 May 2022 19:59:27 +0900
Subject: [PATCH 5/5] =?UTF-8?q?Add=20=EC=98=A4=ED=94=88=EC=B1=84=ED=8C=85?=
 =?UTF-8?q?=EB=B0=A9.js?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...10\354\261\204\355\214\205\353\260\251.js" | 46 ++++++++++++++++++-
 1 file changed, 45 insertions(+), 1 deletion(-)

diff --git "a/level-2/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.js" "b/level-2/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.js"
index b85c6b1..259d864 100644
--- "a/level-2/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.js"
+++ "b/level-2/\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.js"
@@ -36,4 +36,48 @@ function solution(record) {
         map.set(uid, name);
     }
     return answer.map(ele => map.get(ele[0]) + ele[1]);
-}
\ No newline at end of file
+}
+
+//정답 3 - chaerin-dev
+function solution(record) {
+  // 최종 메시지를 저장할 배열
+  let result = [];
+  // 채팅방을 출입하는 유저의 아이디를 차례로 저장할 배열
+  let resultId = [];
+  // 유저의 아이디: 닉네임 쌍을 저장할 Map
+  let idNameMap = new Map();
+
+  // record의 각 문자열을 띄어쓰기 단위로 나눠 배열로 변환
+  record = record.map((e) => e.split(" "));
+
+  // record의 각 요소에 대해
+  record.forEach((e) => {
+    // 각 요소의 첫 번째 요소(Enter/Leave/Change)가
+    switch (e[0]) {
+      // Enter이면
+      case "Enter":
+        // resultID 배열에 들어온 유저의 아이디 저장
+        resultId.push(e[1]);
+        // result 배열에 닉네임을 제외하고 표시될 메시지 저장
+        result.push("님이 들어왔습니다.");
+        // idNameMap Map에 유저의 아이디: 닉네임 쌍 저장
+        idNameMap.set(e[1], e[2]);
+        break;
+      // Leave이면
+      case "Leave":
+        // resultID 배열에 들어온 유저의 아이디 저장
+        resultId.push(e[1]);
+        // result 배열에 닉네임을 제외하고 표시될 메시지 저장
+        result.push("님이 나갔습니다.");
+        break;
+      // Change이면
+      case "Change":
+        // idNameMap Map에 유저의 아이디에 해당하는 닉네임 변경
+        idNameMap.set(e[1], e[2]);
+        break;
+    }
+  });
+
+  // resultId의 각 요소에 해당하는 닉네임을 idNameMap에서 찾아서 result의 각 요소와 이어붙인 값 배열 반환
+  return result.map((e, i) => idNameMap.get(resultId[i]) + e);
+}