Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit c6666a1

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /