Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2020.05.06] 정기 풀이 추가 #53

Merged
merged 5 commits into from
May 6, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion level-1/내적.js
Original file line number Diff line number Diff line change
@@ -33,4 +33,9 @@ function solution(a, b) {
answer += (a[i] * b[i]) // a[i]와 b[i]를 곱한다.
}
return answer;
}
}

//정답 5 - chaerin-dev
function solution(a, b) {
return a.reduce((acc, e, i) => acc + e * b[i], 0);
}
15 changes: 15 additions & 0 deletions level-1/음양-더하기.js
Original file line number Diff line number Diff line change
@@ -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;
}
69 changes: 69 additions & 0 deletions level-1/키패드-누르기.js
Original file line number Diff line number Diff line change
@@ -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;
}

47 changes: 46 additions & 1 deletion level-2/문자열-압축.js
Original file line number Diff line number Diff line change
@@ -23,4 +23,49 @@ function compressedString(str, unitNum) {
}
}
return result.join('')
}
}

//정답 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;
}
46 changes: 45 additions & 1 deletion level-2/오픈채팅방.js
Original file line number Diff line number Diff line change
@@ -36,4 +36,48 @@ function solution(record) {
map.set(uid, name);
}
return answer.map(ele => map.get(ele[0]) + ele[1]);
}
}

//정답 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);
}