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); +}