Repository: DEEPDIVE-coding-potatoes/Algorithm
Pull request #60: Test : 2025-03-25 코딩테스트
Author: login: soyeon0116
Created: 2025-03-25T07:25:16Z | Merged: 2025-03-25T08:07:18Z

## 📆 공부 일자

> 20250325

## 📝 공부 내용

> 문제를 풀긴 풀었지만,,, 코드가 너무 복잡하고 지저분한 것 같아서 고민입니다..ㅠ
유연근무제 문제는 아직 못풀었습니다.....ㅠ

### 스크린샷 (선택)

## 💬 리뷰 요구사항(선택)

> 리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요
>
> ex. 이런 문제를 풀 때 어떤 메서드를 사용하면 좋을까요?



Diff:
diff --git "a/\352\271\200\354\206\214\354\227\260/Lv.1/\352\260\231\354\235\200\354\210\253\354\236\220\353\212\224\354\213\253\354\226\264.js" "b/\352\271\200\354\206\214\354\227\260/Lv.1/\352\260\231\354\235\200\354\210\253\354\236\220\353\212\224\354\213\253\354\226\264.js"
new file mode 100644
index 0000000..0959909
--- /dev/null
+++ "b/\352\271\200\354\206\214\354\227\260/Lv.1/\352\260\231\354\235\200\354\210\253\354\236\220\353\212\224\354\213\253\354\226\264.js"
@@ -0,0 +1,20 @@
+// 같은 숫자는 싫어
+// 배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
+
+// arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
+// arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
+// 배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
+
+// 제한사항
+// 배열 arr의 크기 : 1,000,000 이하의 자연수
+// 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
+
+
+function solution(arr) {
+  let answer = [];
+  answer.push(arr[0]);
+  for (let i = 1; i <= arr.length - 1; i++) {
+    if (answer[answer.length - 1] !== arr[i]) answer.push(arr[i])
+  }
+  return answer;
+}
\ No newline at end of file
diff --git "a/\352\271\200\354\206\214\354\227\260/Lv.1/\352\260\234\354\235\270\354\240\225\353\263\264\354\210\230\354\247\221\354\234\240\355\232\250\352\270\260\352\260\204.js" "b/\352\271\200\354\206\214\354\227\260/Lv.1/\352\260\234\354\235\270\354\240\225\353\263\264\354\210\230\354\247\221\354\234\240\355\232\250\352\270\260\352\260\204.js"
new file mode 100644
index 0000000..b70c64d
--- /dev/null
+++ "b/\352\271\200\354\206\214\354\227\260/Lv.1/\352\260\234\354\235\270\354\240\225\353\263\264\354\210\230\354\247\221\354\234\240\355\232\250\352\270\260\352\260\204.js"
@@ -0,0 +1,35 @@
+// 개인 정보 수집 유효 기간
+// 고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.
+
+// 예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
+// 당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.
+
+// 모든 달은 28일까지 있다고 가정합니다.
+
+// 다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.
+
+function solution(today, terms, privacies) {
+  today = new Date(today.replace(/[.]/g, "-"))
+  let termsObj = {};
+  let privaciesArr = [];
+  terms.forEach(v => {
+    let inner = v.split(' ');
+    termsObj[inner[0]] = inner[1];
+  })
+
+  privacies.forEach(v => {
+    privaciesArr.push(v.split(' '));
+  })
+
+  let date = [];
+  privaciesArr.forEach(v => {
+    v[0] = new Date(v[0].replace(/[.]/g, "-"));
+    v[0].setMonth(v[0].getMonth() + Number(termsObj[v[1]]));
+    date.push(v[0]);
+  })
+  let answer = [];
+  date.forEach((v, i) => {
+    if (v <= today) answer.push(i + 1);
+  })
+  return answer;
+}
\ No newline at end of file
diff --git "a/\352\271\200\354\206\214\354\227\260/Lv.1/\353\213\244\355\212\270\352\262\214\354\236\204.js" "b/\352\271\200\354\206\214\354\227\260/Lv.1/\353\213\244\355\212\270\352\262\214\354\236\204.js"
new file mode 100644
index 0000000..37f81ab
--- /dev/null
+++ "b/\352\271\200\354\206\214\354\227\260/Lv.1/\353\213\244\355\212\270\352\262\214\354\236\204.js"
@@ -0,0 +1,37 @@
+//다트 게임
+// 카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
+// 갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
+
+// 다트 게임은 총 3번의 기회로 구성된다.
+// 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
+// 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
+// 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
+// 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
+// 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
+// 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
+// Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
+// 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.
+// 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
+
+function solution(dartResult) {
+  let dart = dartResult.split('');
+  let answer = [];
+  for (let i = 0; i < dart.length; i++) {
+    if (dart[i] === '0' && dart[i - 1] === '1') dart[i] = 10;
+    if (dart[i] === 'S') answer.push((dart[i - 1] ** 1));
+    if (dart[i] === 'D') answer.push((dart[i - 1] ** 2));
+    if (dart[i] === 'T') answer.push((dart[i - 1] ** 3));
+    if (dart[i] === "*" || dart[i] === "#") answer.push(dart[i]);
+  }
+  for (let i = 0; i < answer.length; i++) {
+    if (answer[i] === '#') answer[i - 1] = answer[i - 1] * -1;
+    if (answer[i] === '*') {
+      answer[i - 1] = answer[i - 1] * 2;
+      if (answer[i - 2] === '*') answer[i - 3] = answer[i - 3] * 2;
+      if (Number(answer[i - 2])) answer[i - 2] = answer[i - 2] * 2;
+      if (answer[i - 2] === '#') answer[i - 3] = answer[i - 3] * 2;
+    }
+  }
+  answer = answer.filter(v => !isNaN(v)).reduce((a, c) => a + c);
+  return answer
+}
\ No newline at end of file
diff --git "a/\352\271\200\354\206\214\354\227\260/Lv.1/\354\202\254\352\263\274\354\236\245\354\210\230.js" "b/\352\271\200\354\206\214\354\227\260/Lv.1/\354\202\254\352\263\274\354\236\245\354\210\230.js"
new file mode 100644
index 0000000..e8ea387
--- /dev/null
+++ "b/\352\271\200\354\206\214\354\227\260/Lv.1/\354\202\254\352\263\274\354\236\245\354\210\230.js"
@@ -0,0 +1,23 @@
+// 사과 장수
+// 과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.
+
+// 한 상자에 사과를 m개씩 담아 포장합니다.
+// 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다.
+// 과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)
+
+// 예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.
+
+// (최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8
+// 사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.
+
+function solution(k, m, score) {
+  let sort = score.sort((a, b) => b - a);
+  let answer = 0;
+  let acc = 0;
+  for (let i = m; i <= score.length; i += m) {
+    let slice = sort.slice(acc, i);
+    acc = i;
+    answer += slice[slice.length - 1] * m;
+  }
+  return answer;
+}
\ No newline at end of file
diff --git "a/\352\271\200\354\206\214\354\227\260/Lv.1/\354\202\274\354\264\235\354\202\254.js" "b/\352\271\200\354\206\214\354\227\260/Lv.1/\354\202\274\354\264\235\354\202\254.js"
new file mode 100644
index 0000000..e9161ce
--- /dev/null
+++ "b/\352\271\200\354\206\214\354\227\260/Lv.1/\354\202\274\354\264\235\354\202\254.js"
@@ -0,0 +1,16 @@
+// 삼총사
+// 한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
+
+// 한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
+
+function solution(number) {
+  let answer = 0;
+  for (let i = 0; i < number.length - 2; i++) {
+    for (let j = i + 1; j < number.length - 1; j++) {
+      for (let k = j + 1; k < number.length; k++) {
+        if (number[i] + number[j] + number[k] === 0) answer += 1;
+      }
+    }
+  }
+  return answer;
+}
\ No newline at end of file
diff --git "a/\352\271\200\354\206\214\354\227\260/Lv.1/\354\225\275\354\210\230\354\235\230\352\260\234\354\210\230\354\231\200\353\215\247\354\205\210.js" "b/\352\271\200\354\206\214\354\227\260/Lv.1/\354\225\275\354\210\230\354\235\230\352\260\234\354\210\230\354\231\200\353\215\247\354\205\210.js"
new file mode 100644
index 0000000..5c7da32
--- /dev/null
+++ "b/\352\271\200\354\206\214\354\227\260/Lv.1/\354\225\275\354\210\230\354\235\230\352\260\234\354\210\230\354\231\200\353\215\247\354\205\210.js"
@@ -0,0 +1,33 @@
+// 약수의 개수와 덧셈
+// 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
+
+function solution(left, right) {
+  let answer = 0;
+  for (let i = left; i <= right; i++) {
+    let leng = division(i);
+    leng % 2 === 0 ? answer += i : answer -= i
+  }
+
+  return answer;
+}
+
+function division(num) {
+  let arr = [];
+  for (i = 1; i <= num; i++) {
+    if (num % i === 0) arr.push(i)
+  };
+  return arr.length;
+}
+
+// 제곱근이 정수이면 약수의 개수가 홀수이다.
+// function solution(left, right) {
+//   var answer = 0;
+//   for (let i = left; i <= right; i++) {
+//     if (Number.isInteger(Math.sqrt(i))) {
+//       answer -= i;
+//     } else {
+//       answer += i;
+//     }
+//   }
+//   return answer;
+// }
\ No newline at end of file
diff --git "a/\352\271\200\354\206\214\354\227\260/Lv.1/\354\235\264\354\203\201\355\225\234\353\254\270\354\236\220\353\247\214\353\223\244\352\270\260.js" "b/\352\271\200\354\206\214\354\227\260/Lv.1/\354\235\264\354\203\201\355\225\234\353\254\270\354\236\220\353\247\214\353\223\244\352\270\260.js"
new file mode 100644
index 0000000..f0b9ae5
--- /dev/null
+++ "b/\352\271\200\354\206\214\354\227\260/Lv.1/\354\235\264\354\203\201\355\225\234\353\254\270\354\236\220\353\247\214\353\223\244\352\270\260.js"
@@ -0,0 +1,11 @@
+// 이상한 문자 만들기
+// 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
+
+function solution(s) {
+  var answer = s.split(' ');
+  answer = answer.map((v) => {
+    return v.split('').map((v, i) => i % 2 === 0 ? v.toUpperCase() : v.toLowerCase()).join('')
+  }).join(' ')
+
+  return answer;
+}
\ No newline at end of file


Reviews:
user: login: yg5057
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T07:45:08Z
user: login: yg5057
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T07:46:56Z
user: login: gaeunchoi
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T07:53:34Z
user: login: SinYusi
body: 너무 잘 푸셨는데요. 저랑 비슷하셔서 크게 피드백 드릴게 없네요. 고생하셨습니다.
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T08:01:41Z

Review comments:
diff_hunk: @@ -0,0 +1,35 @@
+// 개인 정보 수집 유효 기간
+// 고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.
+
+// 예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
+// 당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.
+
+// 모든 달은 28일까지 있다고 가정합니다.
+
+// 다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.
+
+function solution(today, terms, privacies) {
+  today = new Date(today.replace(/[.]/g, "-"))
path: 김소연/Lv.1/개인정보수집유효기간.js
user: login: yg5057
body: 정규식 멋있네요..!!
created_at: 2025-03-25T07:45:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,37 @@
+//다트 게임
+// 카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
+// 갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
+
+// 다트 게임은 총 3번의 기회로 구성된다.
+// 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
+// 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
+// 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
+// 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
+// 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
+// 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
+// Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
+// 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.
+// 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
+
+function solution(dartResult) {
+  let dart = dartResult.split('');
+  let answer = [];
+  for (let i = 0; i < dart.length; i++) {
+    if (dart[i] === '0' && dart[i - 1] === '1') dart[i] = 10;
+    if (dart[i] === 'S') answer.push((dart[i - 1] ** 1));
+    if (dart[i] === 'D') answer.push((dart[i - 1] ** 2));
+    if (dart[i] === 'T') answer.push((dart[i - 1] ** 3));
+    if (dart[i] === "*" || dart[i] === "#") answer.push(dart[i]);
+  }
+  for (let i = 0; i < answer.length; i++) {
+    if (answer[i] === '#') answer[i - 1] = answer[i - 1] * -1;
+    if (answer[i] === '*') {
+      answer[i - 1] = answer[i - 1] * 2;
+      if (answer[i - 2] === '*') answer[i - 3] = answer[i - 3] * 2;
+      if (Number(answer[i - 2])) answer[i - 2] = answer[i - 2] * 2;
+      if (answer[i - 2] === '#') answer[i - 3] = answer[i - 3] * 2;
+    }
+  }
+  answer = answer.filter(v => !isNaN(v)).reduce((a, c) => a + c);
+  return answer
+}
path: 김소연/Lv.1/다트게임.js
user: login: yg5057
body: 살짝 노가다이긴 해도 코드가 직관적이라서 깔끔한것 같습니다!
created_at: 2025-03-25T07:46:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,33 @@
+// 약수의 개수와 덧셈
+// 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
+
+function solution(left, right) {
+  let answer = 0;
+  for (let i = left; i <= right; i++) {
+    let leng = division(i);
+    leng % 2 === 0 ? answer += i : answer -= i
path: 김소연/Lv.1/약수의개수와덧셈.js
user: login: gaeunchoi
body: 요거 answer += leng % 2 === 0 ? i : -i; 로 해도 됩니당 
+=이긴 해도 음수 붙으면 뺄셈으로 가니까용 
created_at: 2025-03-25T07:53:28Z
author_association: CONTRIBUTOR

PR comments:
user: login: yg5057
created_at: 2025-03-25T07:49:29Z
body: 4시간동안 알고리즘 문제 푸시느라 고생많으셨습니다!!
유연근문제 문제가 누락 되신것 같아요!
author_association: CONTRIBUTOR
user: login: gaeunchoi
created_at: 2025-03-25T07:54:52Z
body: 문제 하나 누락된거 올려서 머지해주시면 될 것 같아용 !
오늘도 고생하셨습니다 :)
author_association: CONTRIBUTOR
user: login: ksy21019
created_at: 2025-03-25T07:55:26Z
body: 오랜시간 동안 문제 푸시느라 수고 많으셨습니다!! :)
author_association: CONTRIBUTOR