Skip to content

Commit c6666a1

Browse files
authored
Merge pull request #53 from chaerin-dev/main
[2020.05.06] 정기 풀이 추가
2 parents b3e9f55 + 7be050c commit c6666a1

File tree

5 files changed

+181
-3
lines changed

5 files changed

+181
-3
lines changed

level-1/내적.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,9 @@ function solution(a, b) {
3333
answer += (a[i] * b[i]) // a[i]와 b[i]를 곱한다.
3434
}
3535
return answer;
36-
}
36+
}
37+
38+
//정답 5 - chaerin-dev
39+
function solution(a, b) {
40+
return a.reduce((acc, e, i) => acc + e * b[i], 0);
41+
}

level-1/음양-더하기.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,19 @@ function solution(absolutes, signs) {
5151
answer += absolute;
5252
})
5353
return answer;
54+
}
55+
56+
// 정답 6 - chaerin-dev
57+
function solution(absolutes, signs) {
58+
// 연산 결과를 저장할 변수
59+
let result = 0;
60+
// signs의 각 요소에 대해
61+
signs.forEach((e, i) => {
62+
// 요소가 true이면 result값에 같은 인덱스의 absolutes 요소를 더해줌
63+
if (e) result += absolutes[i];
64+
// 요소가 false이면 result값에 같은 인덱스의 absolutes 요소를 빼줌
65+
else result -= absolutes[i];
66+
});
67+
// result 반환
68+
return result;
5469
}

level-1/키패드-누르기.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,72 @@ function numToLocation(num) {
5252
function distanceBtwLocation(a, b) {
5353
return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
5454
}
55+
56+
//정답 2 - chaerin-dev
57+
function solution(numbers, hand) {
58+
// 키패드를 4행 3열의 이차원 배열이라고 생각
59+
60+
// leftRow, leftCol: 왼손의 현재 위치
61+
let [leftRow, leftCol] = [3, 0];
62+
// rightRow, rightCol: 오른손의 현재 위치
63+
let [rightRow, rightCol] = [3, 2];
64+
// 각 번호를 누른 엄지손가락이 어느 손인지 저장할 문자열
65+
let result = "";
66+
67+
// 눌러야할 각 번호가
68+
numbers.forEach((e) => {
69+
// 1/4/7이면 왼손으로 눌러야하므로
70+
if (e === 1 || e === 4 || e === 7) {
71+
// 왼손의 위치 업데이트
72+
[leftRow, leftCol] = [Math.floor((e - 1) / 3), 0];
73+
// result 문자열에 "L" 이어붙여줌
74+
result += "L";
75+
}
76+
77+
// 3/6/9이면 오른손으로 눌러야하므로
78+
else if (e === 3 || e === 6 || e === 9) {
79+
// 오른손의 위치 업데이트
80+
[rightRow, rightCol] = [Math.floor((e - 1) / 3), 2];
81+
// result 문자열에 "R" 이어붙여줌
82+
result += "R";
83+
}
84+
85+
// 2/5/8/0이면
86+
else {
87+
// 번호 위치 계산의 편의를 위해 눌러야 할 번호가 0일 경우 11로 바꿔줌
88+
if (e === 0) e = 11;
89+
90+
// leftRow, leftCol: 다음에 눌러야 할 번호의 위치
91+
let [nextRow, nextCol] = [Math.floor((e - 1) / 3), 1];
92+
// leftDistance: 현재 왼손의 위치와 다음에 눌러야 할 번호의 위치 사이의 거리
93+
let leftDistance =
94+
Math.abs(leftRow - nextRow) + Math.abs(leftCol - nextCol);
95+
// rightDistance: 현재 오른손의 위치와 다음에 눌러야 할 번호의 위치 사이의 거리
96+
let rightDistance =
97+
Math.abs(rightRow - nextRow) + Math.abs(rightCol - nextCol);
98+
99+
// 왼손이 다음에 눌러야 할 번호의 위치와 더 가깝거나, 두 손의 거리가 같으면서 왼손잡이라면 왼손으로 눌러야하므로
100+
if (
101+
leftDistance < rightDistance ||
102+
(leftDistance == rightDistance && hand === "left")
103+
) {
104+
// 왼손의 위치 업데이트
105+
[leftRow, leftCol] = [nextRow, nextCol];
106+
// result 문자열에 "L" 이어붙여줌
107+
result += "L";
108+
}
109+
110+
// 오른손이 다음에 눌러야 할 번호의 위치와 더 가깝거나, 두 손의 거리가 같으면서 오른손잡이라며 오른손으로 눌러야하므로
111+
else {
112+
// 오른손의 위치 업데이트
113+
[rightRow, rightCol] = [nextRow, nextCol];
114+
// reuslt 문자열에 "R" 이어붙여줌
115+
result += "R";
116+
}
117+
}
118+
});
119+
120+
// result 문자열 반환
121+
return result;
122+
}
123+

level-2/문자열-압축.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,49 @@ function compressedString(str, unitNum) {
2323
}
2424
}
2525
return result.join('')
26-
}
26+
}
27+
28+
//정답 2 - chaerin-dev
29+
function solution(s) {
30+
// len: 압축 전 문자열 길이
31+
const len = s.length;
32+
// shortenLen: 압축 후 문자열 길이의 최솟값을 저장할 변수(압축 전 문자열 길이로 초기화)
33+
let shortenLen = len;
34+
35+
// 문자열을 1개 단위, 2개 단위, ... 문자열 길이의 절반 단위로 잘라가며 압축 수행
36+
for (let i = 1; i <= len / 2; i++) {
37+
// cnt: 단위가 반복되는 횟수를 카운트할 변수
38+
let cnt = 1;
39+
// temp: 현재 단위 문자열을 임시로 저장해둘 변수
40+
let temp = s.slice(0, i);
41+
// shhortenS: 압축 후 문자열을 저장할 변수
42+
let shortenS = "";
43+
44+
// 문자열을 i개 단위로 잘라가며 현재 단위 문자열과 일치하는지 판단
45+
for (let j = i; j < len; j += i) {
46+
// 현재 단위 문자열과 일치하면 단위가 반복되는 횟수 1 증가
47+
if (temp === s.slice(j, j + i)) cnt++;
48+
// 현재 단위 문자열과 일치하지 않으면
49+
else {
50+
// 압축 후 문자열에 단위가 반복되는 횟수와 단위를 이어붙이고
51+
if (cnt === 1) shortenS += temp;
52+
else shortenS += cnt + temp;
53+
54+
// 단위가 반복되는 횟수는 다시 1로 초기화
55+
cnt = 1;
56+
// 현재 단위 문자열 업데이트
57+
temp = s.slice(j, j + i);
58+
}
59+
}
60+
61+
// 반복이 끝난 후 마지막으로 고려했던 단위 문자열도 압축 후 문자열에 이어붙여줘야 함
62+
if (cnt === 1) shortenS += temp;
63+
else shortenS += cnt + temp;
64+
65+
// 압축 후 문자열 길이의 최솟값 업데이트
66+
shortenLen = Math.min(shortenLen, shortenS.length);
67+
}
68+
69+
// 압축 후 문자열 길이의 최솟값 반환
70+
return shortenLen;
71+
}

level-2/오픈채팅방.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,48 @@ function solution(record) {
3636
map.set(uid, name);
3737
}
3838
return answer.map(ele => map.get(ele[0]) + ele[1]);
39-
}
39+
}
40+
41+
//정답 3 - chaerin-dev
42+
function solution(record) {
43+
// 최종 메시지를 저장할 배열
44+
let result = [];
45+
// 채팅방을 출입하는 유저의 아이디를 차례로 저장할 배열
46+
let resultId = [];
47+
// 유저의 아이디: 닉네임 쌍을 저장할 Map
48+
let idNameMap = new Map();
49+
50+
// record의 각 문자열을 띄어쓰기 단위로 나눠 배열로 변환
51+
record = record.map((e) => e.split(" "));
52+
53+
// record의 각 요소에 대해
54+
record.forEach((e) => {
55+
// 각 요소의 첫 번째 요소(Enter/Leave/Change)가
56+
switch (e[0]) {
57+
// Enter이면
58+
case "Enter":
59+
// resultID 배열에 들어온 유저의 아이디 저장
60+
resultId.push(e[1]);
61+
// result 배열에 닉네임을 제외하고 표시될 메시지 저장
62+
result.push("님이 들어왔습니다.");
63+
// idNameMap Map에 유저의 아이디: 닉네임 쌍 저장
64+
idNameMap.set(e[1], e[2]);
65+
break;
66+
// Leave이면
67+
case "Leave":
68+
// resultID 배열에 들어온 유저의 아이디 저장
69+
resultId.push(e[1]);
70+
// result 배열에 닉네임을 제외하고 표시될 메시지 저장
71+
result.push("님이 나갔습니다.");
72+
break;
73+
// Change이면
74+
case "Change":
75+
// idNameMap Map에 유저의 아이디에 해당하는 닉네임 변경
76+
idNameMap.set(e[1], e[2]);
77+
break;
78+
}
79+
});
80+
81+
// resultId의 각 요소에 해당하는 닉네임을 idNameMap에서 찾아서 result의 각 요소와 이어붙인 값 배열 반환
82+
return result.map((e, i) => idNameMap.get(resultId[i]) + e);
83+
}

0 commit comments

Comments
 (0)