Repository: DEEPDIVE-coding-potatoes/Algorithm
Pull request #59: Test: 25-03-25 조연경 알고리즘 문제풀이
Author: login: yg5057
Created: 2025-03-25T07:19:51Z | Merged: 2025-03-25T08:07:41Z

## 📆 공부 일자

> 25.03.05

## 📝 공부 내용

> 1. 같은 숫자는 싫어
> 2. 이상한 문자 만들기
> 3. 과일장수
> 4. 개인정보 수집 유효기간  -> 다른 풀이 보고 풀음
> 5. 약수의 개수와 덧셈
> 6. 삼총사
> 7. 다트 게임 -> 해설 / 다른 풀이 보고 풀음
> 8. 유연 근무제 -> 검색해보며 풀음

> 난이도 상 문제 둘다 풀릴것 같은데 자꾸 틀려서 검색해보면서 풀었습니다. 개인적으로 아쉽네요😦
> 다트게임은 문제 이해하는데 시간을 좀 썼습니당..

## 💬 리뷰 요구사항(선택)

> 리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요
> 코드 리뷰는 언제나 환영입니다! :)



Diff:
diff --git "a/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\203\201_\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/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\203\201_\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..3e65d67
--- /dev/null
+++ "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\203\201_\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,77 @@
+// 문제 설명
+// 고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.
+// 예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
+// 당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.
+// 모든 달은 28일까지 있다고 가정합니다.
+
+// 다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.
+
+// 약관 종류	유효기간
+// A	      6 달
+// B	      12 달
+// C	      3 달
+// 번호	개인정보 수집 일자	약관 종류
+// 1	  2021.05.02	    A
+// 2	  2021.07.01	    B
+// 3	  2022.02.19	    C
+// 4	  2022.02.20	    C
+
+// 첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
+// 두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
+// 세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
+// 네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
+// 따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.
+
+// 오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
+
+// 제한사항
+// today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
+// 1 ≤ terms의 길이 ≤ 20
+// terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
+// 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
+// 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
+// 1 ≤ privacies의 길이 ≤ 100
+// privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
+// privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
+// 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
+// privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
+// today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
+// 2000 ≤ YYYY ≤ 2022
+// 1 ≤ MM ≤ 12
+// MM이 한 자릿수인 경우 앞에 0이 붙습니다.
+// 1 ≤ DD ≤ 28
+// DD가 한 자릿수인 경우 앞에 0이 붙습니다.
+// 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.
+
+
+
+
+
+// 검색 해보며 풀이함
+function solution(today, terms, privacies) {
+  // 1. 약관 종류와 유효기간을 Map으로 저장
+  const termMap = new Map();
+  terms.forEach(term => {
+    const [type, duration] = term.split(" ");
+    termMap.set(type, Number(duration));
+  });
+
+  //  2. 날짜를 총 일수로 변환하는 함수
+  const dateToDays = date => {
+    const [y, m, d] = date.split('.').map(Number);
+    return y * 12 * 28 + m * 28 + d;
+  };
+
+  const todayDays = dateToDays(today);  // 오늘 날짜 변환
+  const result = [];
+
+  // 3. 개인정보 유효기간 검사
+  privacies.forEach((privacy, i) => {
+    const [date, type] = privacy.split(" ");
+    const expiration = dateToDays(date) + termMap.get(type) * 28; // 만료일 계산
+
+    if (expiration <= todayDays) result.push(i + 1); // 파기 대상 추가
+  });
+
+  return result;
+}
diff --git "a/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\203\201_\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.js" "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\203\201_\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.js"
new file mode 100644
index 0000000..5a5404b
--- /dev/null
+++ "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\203\201_\354\234\240\354\227\260\352\267\274\353\254\264\354\240\234.js"	
@@ -0,0 +1,94 @@
+// 문제 설명
+// 프로그래머스 사이트를 운영하는 그렙에서는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행하고 있습니다. 제도 정착을 위해 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주는 이벤트를 진행하려고 합니다.
+// 직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 10분까지 어플로 출근해야 합니다. 예를 들어 출근 희망 시각이 9시 58분인 직원은 10시 8분까지 출근해야 합니다. 단, 토요일, 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 직원들은 매일 한 번씩만 어플로 출근하고, 모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현됩니다. 예를 들어 10시 13분은 1013이 되고 9시 58분은 958이 됩니다.
+// 당신은 직원들이 설정한 출근 희망 시각과 실제로 출근한 기록을 바탕으로 상품을 받을 직원이 몇 명인지 알고 싶습니다.
+// 직원 n명이 설정한 출근 희망 시각을 담은 1차원 정수 배열 schedules, 직원들이 일주일 동안 출근한 시각을 담은 2차원 정수 배열 timelogs, 이벤트를 시작한 요일을 의미하는 정수 startday가 매개변수로 주어집니다. 이때 상품을 받을 직원의 수를 return 하도록 solution 함수를 완성해주세요.
+
+// 제한사항
+// 1 ≤ schedules의 길이 = n ≤ 1,000
+// schedules[i]는 i + 1번째 직원이 설정한 출근 희망 시각을 의미합니다.
+// 700 ≤ schedules[i] ≤ 1100
+// 1 ≤ timelogs의 길이 = n ≤ 1,000
+// timelogs[i]의 길이 = 7
+// timelogs[i][j]는 i + 1번째 직원이 이벤트 j + 1일차에 출근한 시각을 의미합니다.
+// 600 ≤ timelogs[i][j] ≤ 2359
+// 1 ≤ startday ≤ 7
+// 1은 월요일, 2는 화요일, 3은 수요일, 4는 목요일, 5는 금요일, 6은 토요일, 7은 일요일에 이벤트를 시작했음을 의미합니다.
+// 출근 희망 시각과 실제로 출근한 시각을 100으로 나눈 나머지는 59 이하입니다.
+// 테스트 케이스 구성 안내
+// 아래는 테스트 케이스 구성을 나타냅니다. 각 그룹 내의 테스트 케이스를 모두 통과하면 해당 그룹에 할당된 점수를 획득할 수 있습니다.
+
+// 그룹	총점	추가 제한 사항
+// #1	10%	n = 1. 이벤트 시작일이 월요일이고, 출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #2	10%	이벤트 시작일이 월요일이고, 출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #3	15%	출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #4	15%	이벤트 시작일이 월요일인 입력만 주어집니다.
+// #5	50%	제한사항 외 추가조건이 없습니다.
+
+// 입출력 예
+// schedules	timelogs	startday	result
+// [700, 800, 1100]	[[710, 2359, 1050, 700, 650, 631, 659], [800, 801, 805, 800, 759, 810, 809], [1105, 1001, 1002, 600, 1059, 1001, 1100]]	5	3
+// [730, 855, 700, 720]	[[710, 700, 650, 735, 700, 931, 912], [908, 901, 805, 815, 800, 831, 835], [705, 701, 702, 705, 710, 710, 711], [707, 731, 859, 913, 934, 931, 905]]	1	2
+
+
+// 입출력 예 #1
+// 이벤트를 시작한 날은 금요일입니다. 직원 3명의 일주일 간 출근 시각을 나타내면 다음과 같습니다.
+
+// 출근 희망 시각	출근 인정 시각
+// 7:00	7:10
+// 8:00	8:10
+// 11:00	11:10
+// 금	토	일	월	화	수	목
+// 7:10	23:59	10:50	7:00	6:50	6:31	6:59
+// 8:00	8:01	8:05	8:00	7:59	8:10	8:09
+// 11:05	10:01	10:02	6:00	10:59	10:01	11:00
+// 모든 직원이 평일에 늦지 않고 출근했습니다. 따라서 상품을 받을 직원은 3명입니다.
+
+
+// 입출력 예 #2
+// 이벤트를 시작한 날은 월요일입니다. 직원 4명의 일주일 간 출근 시각을 나타내면 다음과 같습니다. 취소선으로 표시된 시각이 출근이 필요한 평일에 지각한 날입니다.
+
+// 출근 희망 시각	출근 인정 시각
+// 7:30	7:40
+// 8:55	9:05
+// 7:00	7:10
+// 7:20	7:30
+// 월	화	수	목	금	토	일
+// 7:10	7:00	6:50	7:35	7:00	9:31	9:12
+// 9:08	9:01	8:05	8:15	8:00	8:31	8:35
+// 7:05	7:01	7:02	7:05	7:10	7:10	7:11
+// 7:07	7:31	8:59	9:13	9:34	9:31	9:05
+// 첫 번째, 세 번째 직원이 평일에 늦지 않고 출근했습니다. 따라서 상품을 받을 직원은 2명입니다.
+
+
+
+
+// 검색하면서 풀었음
+function solution(schedules, timelogs, startday) {
+  let answer = 0;
+
+  // 1. 출근 희망 시각 + 10분 계산 함수
+  const getMaxArrivalTime = (time) => time + 10;
+
+  // 2. 시작 요일을 기준으로 실제 요일에 맞게 출근 기록을 확인
+  for (let i = 0; i < timelogs.length; i++) {
+    let isPassed = true;
+
+    // 3. 각 직원의 출근 기록을 순회
+    for (let j = 0; j < 5; j++) {  // 평일 (월~금: 0~4)
+      const attendTime = timelogs[i][(startday + j - 1) % 7];
+      const scheduledTime = schedules[i];
+      const maxArrivalTime = getMaxArrivalTime(scheduledTime);
+      if (attendTime > maxArrivalTime) {
+        isPassed = false;
+        break;
+      }
+    }
+    // 4. 평일에 모두 출근한 직원은 상품을 받음
+    if (isPassed) answer++;
+  }
+  return answer;
+}
+
+
+
diff --git "a/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\244\221_\352\263\274\354\235\274\354\236\245\354\210\230.js" "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\244\221_\352\263\274\354\235\274\354\236\245\354\210\230.js"
new file mode 100644
index 0000000..3356dca
--- /dev/null
+++ "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\244\221_\352\263\274\354\235\274\354\236\245\354\210\230.js"	
@@ -0,0 +1,30 @@
+// 문제 설명
+// 과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 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 함수를 완성해주세요.
+
+// 제한사항
+// 3 ≤ k ≤ 9
+// 3 ≤ m ≤ 10
+// 7 ≤ score의 길이 ≤ 1,000,000
+// 1 ≤ score[i] ≤ k
+// 이익이 발생하지 않는 경우에는 0을 return 해주세요.
+
+
+function solution(k, m, score) {
+  score.sort((a, b) => b - a);
+
+  let res = 0;
+  for (let i = m - 1; i < score.length; i += m) {
+    const oneBoxPrice = score[i] * m;
+    res += oneBoxPrice;
+  }
+  return res;
+}
diff --git "a/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\244\221_\353\213\244\355\212\270\352\262\214\354\236\204.js" "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\244\221_\353\213\244\355\212\270\352\262\214\354\236\204.js"
new file mode 100644
index 0000000..5efc9eb
--- /dev/null
+++ "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \354\244\221_\353\213\244\355\212\270\352\262\214\354\236\204.js"	
@@ -0,0 +1,111 @@
+// 문제 설명
+// 다트 게임
+
+// 카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
+// 갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
+
+// 다트 게임은 총 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, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
+
+// 입력 형식
+// "점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
+// 예) 1S2D*3T
+
+// 점수는 0에서 10 사이의 정수이다.
+// 보너스는 S, D, T 중 하나이다.
+// 옵선은 *이나 # 중 하나이며, 없을 수도 있다.
+// 출력 형식
+// 3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
+// 예) 37
+
+// 입출력 예제
+// 예제	dartResult	answer	설명
+// 1	1S2D*3T	37	11 * 2 + 22 * 2 + 33
+// 2	1D2S#10S	9	12 + 21 * (-1) + 101
+// 3	1D2S0T	3	12 + 21 + 03
+// 4	1S*2T*3S	23	11 * 2 * 2 + 23 * 2 + 31
+// 5	1D#2S*3S	5	12 * (-1) * 2 + 21 * 2 + 31
+// 6	1T2D3D#	-4	13 + 22 + 32 * (-1)
+// 7	1D2S3T*	59	12 + 21 * 2 + 33 * 2
+
+
+
+
+
+// [다른 사람 풀이 보고 풀음]
+function solution(dartResult) {
+  // 보너스 점수 맵핑 (S: 1제곱, D: 2제곱, T: 3제곱)
+  const bonus = { 'S': 1, 'D': 2, 'T': 3 };
+
+  // 옵션 점수 맵핑 (*: 2배, #: -1배, 옵션이 없을 경우 1배)
+  const options = { '*': 2, '#': -1, undefined: 1 };
+
+  // 정규식을 이용하여 "숫자 + 보너스 + 옵션"을 한 묶음으로 추출
+  let darts = dartResult.match(/\d.?\D/g);
+
+  for (let i = 0; i < darts.length; i++) {
+    // 정규식을 이용하여 각 다트 점수의 숫자, 보너스, 옵션 분리
+    let split = darts[i].match(/(^\d{1,})(S|D|T)(\*|#)?/);
+
+    // 점수 계산: (기본 점수^보너스) * 옵션
+    let score = Math.pow(split[1], bonus[split[2]]) * options[split[3]];
+
+    // '*' 옵션이 존재하면 이전 점수도 2배 처리
+    if (split[3] === '*' && darts[i - 1]) darts[i - 1] *= options['*'];
+
+    // 계산된 점수를 darts 배열에 저장
+    darts[i] = score;
+  }
+
+  // 최종 점수 합산하여 반환
+  return darts.reduce((a, b) => a + b);
+}
+
+
+
+
+//[정규식 사용 X 풀이]
+function solution(dartResult) {
+  const bonus = { 'S': 1, 'D': 2, 'T': 3 }; // 보너스 맵핑
+  const scores = []; // 점수를 저장할 배열
+
+  let num = ''; // 현재 숫자를 저장할 변수
+
+  for (let i = 0; i < dartResult.length; i++) {
+    let char = dartResult[i];
+
+    // 숫자일 경우 (연속된 숫자도 포함 가능)
+    if (!isNaN(char)) {
+      num += char; // 10일 경우 대비하여 문자열로 저장
+    }
+
+    // 보너스 문자인 경우 (S, D, T)
+    else if (char in bonus) {
+      let score = Math.pow(Number(num), bonus[char]); // 숫자를 보너스 값만큼 제곱
+      scores.push(score); // 점수를 배열에 저장
+      num = ''; // 숫자 초기화
+    }
+
+    // 옵션 문자인 경우 (*, #)
+    else {
+      let lastIdx = scores.length - 1; // 마지막 점수의 위치
+
+      if (char === '*') {
+        scores[lastIdx] *= 2; // 현재 점수 2배
+        if (lastIdx > 0) scores[lastIdx - 1] *= 2; // 이전 점수도 2배
+      } else if (char === '#') {
+        scores[lastIdx] *= -1; // 현재 점수를 마이너스로 변환
+      }
+    }
+  }
+
+  return scores.reduce((acc, cur) => acc + cur, 0); // 모든 점수 합산 후 반환
+}
diff --git "a/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\352\260\231\354\235\200 \354\210\253\354\236\220\353\212\224 \354\213\253\354\226\264.js" "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\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..122d2eb
--- /dev/null
+++ "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\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,27 @@
+// 문제 설명
+// 배열 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보다 작거나 같은 정수
+
+
+
+
+
+// ! 가은님 Tip - 자료구조 stack 사용해서 풀기
+function solution(arr) {
+  let res = [];
+
+  for (let i = 0; i < arr.length; i++) {
+    if (res.length === 0 || res[res.length - 1] !== arr[i]) {
+      res.push(arr[i]);
+    }
+  }
+
+  return res;
+}
\ No newline at end of file
diff --git "a/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\354\202\274\354\264\235\354\202\254.js" "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\354\202\274\354\264\235\354\202\254.js"
new file mode 100644
index 0000000..d5c3409
--- /dev/null
+++ "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\354\202\274\354\264\235\354\202\254.js"	
@@ -0,0 +1,39 @@
+// 문제 설명
+// 한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
+
+// 한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
+
+// 제한사항
+// 3 ≤ number의 길이 ≤ 13
+// -1,000 ≤ number의 각 원소 ≤ 1,000
+// 서로 다른 학생의 정수 번호가 같을 수 있습니다.
+
+// 입출력 예
+// number	                    result
+// [-2, 3, 0, 2, -5]	        2
+// [-3, -2, -1, 0, 1, 2, 3]	  5
+// [-1, 1, -1, 1]	            0
+
+
+
+// ! 가은님 Tip - 조합 이용하기
+function getCombinations(arr, r) {
+  const results = [];
+  if (r === 1) return arr.map(v => [v]); // 1개만 뽑을 경우 각각 배열로 반환
+
+  arr.forEach((fixed, idx, origin) => {
+    const rest = origin.slice(idx + 1); // 현재 요소를 제외한 나머지 요소
+    const combinations = getCombinations(rest, r - 1); // 나머지 요소들 중에서 r - 1 개의 조합 구하기
+    const attached = combinations.map(combination => [fixed, ...combination]); // 현재 요소와 조합된 나머지 요소 합치기
+    results.push(...attached);
+  });
+
+  return results;
+}
+
+function solution(number) {
+  return getCombinations(number, 3) // 3개씩 조합을 구하기
+    .filter(comb => comb.reduce((sum, num) => sum + num, 0) === 0) // 합이 0인 경우 필터링
+    .length; // 총 개수 반환
+}
+
diff --git "a/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\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/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\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..2f6c4da
--- /dev/null
+++ "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\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,46 @@
+// 문제 설명
+// 두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
+
+// 제한사항
+// 1 ≤ left ≤ right ≤ 1,000
+// 입출력 예
+// left	right	result
+// 13	17	43
+// 24	27	52
+
+
+
+function solution(left, right) {
+  let res = 0;
+  for (let i = left; i <= right; i++) {
+    let count = 0;
+
+    for (let j = 1; j <= Math.sqrt(i); j++) {
+      if (i % j === 0) {
+        count++;
+        if (j !== i / j) {
+          count++;
+        }
+      }
+    }
+    if (count % 2 === 0) { res += i; }
+    else { res -= i; }
+  }
+  return res;
+}
+
+
+// [좋아요 많은 풀이]
+// 약수의 갯수가 홀수인 수 -> 제곱수 ㄷㅂ;; 
+
+// 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/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\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/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\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..9c72570
--- /dev/null
+++ "b/\354\241\260\354\227\260\352\262\275/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\275\224\353\224\251 \352\270\260\354\264\210 \355\212\270\353\240\210\354\235\264\353\213\235_Lv.1/\353\202\234\354\235\264\353\217\204 \355\225\230_\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,24 @@
+// 문제 설명
+// 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
+
+// 제한 사항
+// 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
+// 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
+
+
+
+function solution(s) {
+  const str = s.split(' ');
+
+  const result = str.map(word => {
+    return word.split('').map((char, idx) => {
+      if (idx % 2 === 0) {
+        return char.toUpperCase();
+      } else {
+        return char.toLowerCase();
+      }
+    }).join('');
+  }).join(' ');
+
+  return result;
+} 
\ No newline at end of file


Reviews:
user: login: soyeon0116
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T07:44:24Z
user: login: SinYusi
body: 긴 시간의 문제풀이 정말 고생하셨습니다.
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T07:45:10Z
user: login: gaeunchoi
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T07:50:48Z
user: login: yg5057
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T07:53:55Z
user: login: yg5057
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T07:55:48Z

Review comments:
diff_hunk: @@ -0,0 +1,94 @@
+// 문제 설명
+// 프로그래머스 사이트를 운영하는 그렙에서는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행하고 있습니다. 제도 정착을 위해 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주는 이벤트를 진행하려고 합니다.
+// 직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 10분까지 어플로 출근해야 합니다. 예를 들어 출근 희망 시각이 9시 58분인 직원은 10시 8분까지 출근해야 합니다. 단, 토요일, 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 직원들은 매일 한 번씩만 어플로 출근하고, 모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현됩니다. 예를 들어 10시 13분은 1013이 되고 9시 58분은 958이 됩니다.
+// 당신은 직원들이 설정한 출근 희망 시각과 실제로 출근한 기록을 바탕으로 상품을 받을 직원이 몇 명인지 알고 싶습니다.
+// 직원 n명이 설정한 출근 희망 시각을 담은 1차원 정수 배열 schedules, 직원들이 일주일 동안 출근한 시각을 담은 2차원 정수 배열 timelogs, 이벤트를 시작한 요일을 의미하는 정수 startday가 매개변수로 주어집니다. 이때 상품을 받을 직원의 수를 return 하도록 solution 함수를 완성해주세요.
+
+// 제한사항
+// 1 ≤ schedules의 길이 = n ≤ 1,000
+// schedules[i]는 i + 1번째 직원이 설정한 출근 희망 시각을 의미합니다.
+// 700 ≤ schedules[i] ≤ 1100
+// 1 ≤ timelogs의 길이 = n ≤ 1,000
+// timelogs[i]의 길이 = 7
+// timelogs[i][j]는 i + 1번째 직원이 이벤트 j + 1일차에 출근한 시각을 의미합니다.
+// 600 ≤ timelogs[i][j] ≤ 2359
+// 1 ≤ startday ≤ 7
+// 1은 월요일, 2는 화요일, 3은 수요일, 4는 목요일, 5는 금요일, 6은 토요일, 7은 일요일에 이벤트를 시작했음을 의미합니다.
+// 출근 희망 시각과 실제로 출근한 시각을 100으로 나눈 나머지는 59 이하입니다.
+// 테스트 케이스 구성 안내
+// 아래는 테스트 케이스 구성을 나타냅니다. 각 그룹 내의 테스트 케이스를 모두 통과하면 해당 그룹에 할당된 점수를 획득할 수 있습니다.
+
+// 그룹	총점	추가 제한 사항
+// #1	10%	n = 1. 이벤트 시작일이 월요일이고, 출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #2	10%	이벤트 시작일이 월요일이고, 출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #3	15%	출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #4	15%	이벤트 시작일이 월요일인 입력만 주어집니다.
+// #5	50%	제한사항 외 추가조건이 없습니다.
+
+// 입출력 예
+// schedules	timelogs	startday	result
+// [700, 800, 1100]	[[710, 2359, 1050, 700, 650, 631, 659], [800, 801, 805, 800, 759, 810, 809], [1105, 1001, 1002, 600, 1059, 1001, 1100]]	5	3
+// [730, 855, 700, 720]	[[710, 700, 650, 735, 700, 931, 912], [908, 901, 805, 815, 800, 831, 835], [705, 701, 702, 705, 710, 710, 711], [707, 731, 859, 913, 934, 931, 905]]	1	2
+
+
+// 입출력 예 #1
+// 이벤트를 시작한 날은 금요일입니다. 직원 3명의 일주일 간 출근 시각을 나타내면 다음과 같습니다.
+
+// 출근 희망 시각	출근 인정 시각
+// 7:00	7:10
+// 8:00	8:10
+// 11:00	11:10
+// 금	토	일	월	화	수	목
+// 7:10	23:59	10:50	7:00	6:50	6:31	6:59
+// 8:00	8:01	8:05	8:00	7:59	8:10	8:09
+// 11:05	10:01	10:02	6:00	10:59	10:01	11:00
+// 모든 직원이 평일에 늦지 않고 출근했습니다. 따라서 상품을 받을 직원은 3명입니다.
+
+
+// 입출력 예 #2
+// 이벤트를 시작한 날은 월요일입니다. 직원 4명의 일주일 간 출근 시각을 나타내면 다음과 같습니다. 취소선으로 표시된 시각이 출근이 필요한 평일에 지각한 날입니다.
+
+// 출근 희망 시각	출근 인정 시각
+// 7:30	7:40
+// 8:55	9:05
+// 7:00	7:10
+// 7:20	7:30
+// 월	화	수	목	금	토	일
+// 7:10	7:00	6:50	7:35	7:00	9:31	9:12
+// 9:08	9:01	8:05	8:15	8:00	8:31	8:35
+// 7:05	7:01	7:02	7:05	7:10	7:10	7:11
+// 7:07	7:31	8:59	9:13	9:34	9:31	9:05
+// 첫 번째, 세 번째 직원이 평일에 늦지 않고 출근했습니다. 따라서 상품을 받을 직원은 2명입니다.
+
+
+
+
+// 검색하면서 풀었음
+function solution(schedules, timelogs, startday) {
+  let answer = 0;
+
+  // 1. 출근 희망 시각 + 10분 계산 함수
+  const getMaxArrivalTime = (time) => time + 10;
+
+  // 2. 시작 요일을 기준으로 실제 요일에 맞게 출근 기록을 확인
+  for (let i = 0; i < timelogs.length; i++) {
+    let isPassed = true;
+
+    // 3. 각 직원의 출근 기록을 순회
+    for (let j = 0; j < 5; j++) {  // 평일 (월~금: 0~4)
+      const attendTime = timelogs[i][(startday + j - 1) % 7];
+      const scheduledTime = schedules[i];
+      const maxArrivalTime = getMaxArrivalTime(scheduledTime);
+      if (attendTime > maxArrivalTime) {
path: 조연경/프로그래머스_코딩 기초 트레이닝_Lv.1/난이도 상_유연근무제.js
user: login: SinYusi
body: 문제 정답 됐을까요?? 직원이 바라는 출근 시간에서 +10분을 했을 때 정각을 넘어가는 상황에 대해 예외 상황이 생길 것 같아요
created_at: 2025-03-25T07:43:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,111 @@
+// 문제 설명
+// 다트 게임
+
+// 카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
+// 갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
+
+// 다트 게임은 총 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, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
+
+// 입력 형식
+// "점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
+// 예) 1S2D*3T
+
+// 점수는 0에서 10 사이의 정수이다.
+// 보너스는 S, D, T 중 하나이다.
+// 옵선은 *이나 # 중 하나이며, 없을 수도 있다.
+// 출력 형식
+// 3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
+// 예) 37
+
+// 입출력 예제
+// 예제	dartResult	answer	설명
+// 1	1S2D*3T	37	11 * 2 + 22 * 2 + 33
+// 2	1D2S#10S	9	12 + 21 * (-1) + 101
+// 3	1D2S0T	3	12 + 21 + 03
+// 4	1S*2T*3S	23	11 * 2 * 2 + 23 * 2 + 31
+// 5	1D#2S*3S	5	12 * (-1) * 2 + 21 * 2 + 31
+// 6	1T2D3D#	-4	13 + 22 + 32 * (-1)
+// 7	1D2S3T*	59	12 + 21 * 2 + 33 * 2
+
+
+
+
+
+// [다른 사람 풀이 보고 풀음]
+function solution(dartResult) {
+  // 보너스 점수 맵핑 (S: 1제곱, D: 2제곱, T: 3제곱)
+  const bonus = { 'S': 1, 'D': 2, 'T': 3 };
path: 조연경/프로그래머스_코딩 기초 트레이닝_Lv.1/난이도 중_다트게임.js
user: login: soyeon0116
body: 오... 이런 방법이..
created_at: 2025-03-25T07:44:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,94 @@
+// 문제 설명
+// 프로그래머스 사이트를 운영하는 그렙에서는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행하고 있습니다. 제도 정착을 위해 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주는 이벤트를 진행하려고 합니다.
+// 직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 10분까지 어플로 출근해야 합니다. 예를 들어 출근 희망 시각이 9시 58분인 직원은 10시 8분까지 출근해야 합니다. 단, 토요일, 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 직원들은 매일 한 번씩만 어플로 출근하고, 모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현됩니다. 예를 들어 10시 13분은 1013이 되고 9시 58분은 958이 됩니다.
+// 당신은 직원들이 설정한 출근 희망 시각과 실제로 출근한 기록을 바탕으로 상품을 받을 직원이 몇 명인지 알고 싶습니다.
+// 직원 n명이 설정한 출근 희망 시각을 담은 1차원 정수 배열 schedules, 직원들이 일주일 동안 출근한 시각을 담은 2차원 정수 배열 timelogs, 이벤트를 시작한 요일을 의미하는 정수 startday가 매개변수로 주어집니다. 이때 상품을 받을 직원의 수를 return 하도록 solution 함수를 완성해주세요.
+
+// 제한사항
+// 1 ≤ schedules의 길이 = n ≤ 1,000
+// schedules[i]는 i + 1번째 직원이 설정한 출근 희망 시각을 의미합니다.
+// 700 ≤ schedules[i] ≤ 1100
+// 1 ≤ timelogs의 길이 = n ≤ 1,000
+// timelogs[i]의 길이 = 7
+// timelogs[i][j]는 i + 1번째 직원이 이벤트 j + 1일차에 출근한 시각을 의미합니다.
+// 600 ≤ timelogs[i][j] ≤ 2359
+// 1 ≤ startday ≤ 7
+// 1은 월요일, 2는 화요일, 3은 수요일, 4는 목요일, 5는 금요일, 6은 토요일, 7은 일요일에 이벤트를 시작했음을 의미합니다.
+// 출근 희망 시각과 실제로 출근한 시각을 100으로 나눈 나머지는 59 이하입니다.
+// 테스트 케이스 구성 안내
+// 아래는 테스트 케이스 구성을 나타냅니다. 각 그룹 내의 테스트 케이스를 모두 통과하면 해당 그룹에 할당된 점수를 획득할 수 있습니다.
+
+// 그룹	총점	추가 제한 사항
+// #1	10%	n = 1. 이벤트 시작일이 월요일이고, 출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #2	10%	이벤트 시작일이 월요일이고, 출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #3	15%	출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #4	15%	이벤트 시작일이 월요일인 입력만 주어집니다.
+// #5	50%	제한사항 외 추가조건이 없습니다.
+
+// 입출력 예
+// schedules	timelogs	startday	result
+// [700, 800, 1100]	[[710, 2359, 1050, 700, 650, 631, 659], [800, 801, 805, 800, 759, 810, 809], [1105, 1001, 1002, 600, 1059, 1001, 1100]]	5	3
+// [730, 855, 700, 720]	[[710, 700, 650, 735, 700, 931, 912], [908, 901, 805, 815, 800, 831, 835], [705, 701, 702, 705, 710, 710, 711], [707, 731, 859, 913, 934, 931, 905]]	1	2
+
+
+// 입출력 예 #1
+// 이벤트를 시작한 날은 금요일입니다. 직원 3명의 일주일 간 출근 시각을 나타내면 다음과 같습니다.
+
+// 출근 희망 시각	출근 인정 시각
+// 7:00	7:10
+// 8:00	8:10
+// 11:00	11:10
+// 금	토	일	월	화	수	목
+// 7:10	23:59	10:50	7:00	6:50	6:31	6:59
+// 8:00	8:01	8:05	8:00	7:59	8:10	8:09
+// 11:05	10:01	10:02	6:00	10:59	10:01	11:00
+// 모든 직원이 평일에 늦지 않고 출근했습니다. 따라서 상품을 받을 직원은 3명입니다.
+
+
+// 입출력 예 #2
+// 이벤트를 시작한 날은 월요일입니다. 직원 4명의 일주일 간 출근 시각을 나타내면 다음과 같습니다. 취소선으로 표시된 시각이 출근이 필요한 평일에 지각한 날입니다.
+
+// 출근 희망 시각	출근 인정 시각
+// 7:30	7:40
+// 8:55	9:05
+// 7:00	7:10
+// 7:20	7:30
+// 월	화	수	목	금	토	일
+// 7:10	7:00	6:50	7:35	7:00	9:31	9:12
+// 9:08	9:01	8:05	8:15	8:00	8:31	8:35
+// 7:05	7:01	7:02	7:05	7:10	7:10	7:11
+// 7:07	7:31	8:59	9:13	9:34	9:31	9:05
+// 첫 번째, 세 번째 직원이 평일에 늦지 않고 출근했습니다. 따라서 상품을 받을 직원은 2명입니다.
+
+
+
+
+// 검색하면서 풀었음
+function solution(schedules, timelogs, startday) {
+  let answer = 0;
+
+  // 1. 출근 희망 시각 + 10분 계산 함수
+  const getMaxArrivalTime = (time) => time + 10;
+
+  // 2. 시작 요일을 기준으로 실제 요일에 맞게 출근 기록을 확인
+  for (let i = 0; i < timelogs.length; i++) {
+    let isPassed = true;
+
+    // 3. 각 직원의 출근 기록을 순회
+    for (let j = 0; j < 5; j++) {  // 평일 (월~금: 0~4)
+      const attendTime = timelogs[i][(startday + j - 1) % 7];
+      const scheduledTime = schedules[i];
+      const maxArrivalTime = getMaxArrivalTime(scheduledTime);
+      if (attendTime > maxArrivalTime) {
path: 조연경/프로그래머스_코딩 기초 트레이닝_Lv.1/난이도 상_유연근무제.js
user: login: gaeunchoi
body: 맞아요 예외 발생합니다잉 이거 수정이 필요할 것 같아요 !
created_at: 2025-03-25T07:48:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,27 @@
+// 문제 설명
+// 배열 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보다 작거나 같은 정수
+
+
+
+
+
+// ! 가은님 Tip - 자료구조 stack 사용해서 풀기
+function solution(arr) {
+  let res = [];
+
+  for (let i = 0; i < arr.length; i++) {
+    if (res.length === 0 || res[res.length - 1] !== arr[i]) {
+      res.push(arr[i]);
+    }
+  }
+
+  return res;
+}
path: 조연경/프로그래머스_코딩 기초 트레이닝_Lv.1/난이도 하_같은 숫자는 싫어.js
user: login: gaeunchoi
body: ㅋㅋㅋ이 문제가 알고리즘 고득점Kit - 스택/큐 Lv.1에 있는 문제라서 스택 써서 풀어보시는게 좋을듯하여 가져왔습니당 
좋네용 !!! 🥰
created_at: 2025-03-25T07:49:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,39 @@
+// 문제 설명
+// 한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
+
+// 한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
+
+// 제한사항
+// 3 ≤ number의 길이 ≤ 13
+// -1,000 ≤ number의 각 원소 ≤ 1,000
+// 서로 다른 학생의 정수 번호가 같을 수 있습니다.
+
+// 입출력 예
+// number	                    result
+// [-2, 3, 0, 2, -5]	        2
+// [-3, -2, -1, 0, 1, 2, 3]	  5
+// [-1, 1, -1, 1]	            0
+
+
+
+// ! 가은님 Tip - 조합 이용하기
+function getCombinations(arr, r) {
+  const results = [];
+  if (r === 1) return arr.map(v => [v]); // 1개만 뽑을 경우 각각 배열로 반환
+
+  arr.forEach((fixed, idx, origin) => {
+    const rest = origin.slice(idx + 1); // 현재 요소를 제외한 나머지 요소
+    const combinations = getCombinations(rest, r - 1); // 나머지 요소들 중에서 r - 1 개의 조합 구하기
+    const attached = combinations.map(combination => [fixed, ...combination]); // 현재 요소와 조합된 나머지 요소 합치기
+    results.push(...attached);
+  });
+
+  return results;
+}
+
path: 조연경/프로그래머스_코딩 기초 트레이닝_Lv.1/난이도 하_삼총사.js
user: login: gaeunchoi
body: 조합까지 공부하시고 ... !! 너무 좋습니다 !!!
created_at: 2025-03-25T07:50:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,24 @@
+// 문제 설명
+// 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
+
+// 제한 사항
+// 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
+// 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
+
+
+
+function solution(s) {
+  const str = s.split(' ');
+
+  const result = str.map(word => {
+    return word.split('').map((char, idx) => {
+      if (idx % 2 === 0) {
+        return char.toUpperCase();
+      } else {
+        return char.toLowerCase();
+      }
path: 조연경/프로그래머스_코딩 기초 트레이닝_Lv.1/난이도 하_이상한 문자 만들기.js
user: login: gaeunchoi
body: 삼항연산자로 줄여도 되겠네용 !
created_at: 2025-03-25T07:50:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,94 @@
+// 문제 설명
+// 프로그래머스 사이트를 운영하는 그렙에서는 재택근무와 함께 출근 희망 시각을 자유롭게 정하는 유연근무제를 시행하고 있습니다. 제도 정착을 위해 오늘부터 일주일 동안 각자 설정한 출근 희망 시각에 늦지 않고 출근한 직원들에게 상품을 주는 이벤트를 진행하려고 합니다.
+// 직원들은 일주일동안 자신이 설정한 출근 희망 시각 + 10분까지 어플로 출근해야 합니다. 예를 들어 출근 희망 시각이 9시 58분인 직원은 10시 8분까지 출근해야 합니다. 단, 토요일, 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 직원들은 매일 한 번씩만 어플로 출근하고, 모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현됩니다. 예를 들어 10시 13분은 1013이 되고 9시 58분은 958이 됩니다.
+// 당신은 직원들이 설정한 출근 희망 시각과 실제로 출근한 기록을 바탕으로 상품을 받을 직원이 몇 명인지 알고 싶습니다.
+// 직원 n명이 설정한 출근 희망 시각을 담은 1차원 정수 배열 schedules, 직원들이 일주일 동안 출근한 시각을 담은 2차원 정수 배열 timelogs, 이벤트를 시작한 요일을 의미하는 정수 startday가 매개변수로 주어집니다. 이때 상품을 받을 직원의 수를 return 하도록 solution 함수를 완성해주세요.
+
+// 제한사항
+// 1 ≤ schedules의 길이 = n ≤ 1,000
+// schedules[i]는 i + 1번째 직원이 설정한 출근 희망 시각을 의미합니다.
+// 700 ≤ schedules[i] ≤ 1100
+// 1 ≤ timelogs의 길이 = n ≤ 1,000
+// timelogs[i]의 길이 = 7
+// timelogs[i][j]는 i + 1번째 직원이 이벤트 j + 1일차에 출근한 시각을 의미합니다.
+// 600 ≤ timelogs[i][j] ≤ 2359
+// 1 ≤ startday ≤ 7
+// 1은 월요일, 2는 화요일, 3은 수요일, 4는 목요일, 5는 금요일, 6은 토요일, 7은 일요일에 이벤트를 시작했음을 의미합니다.
+// 출근 희망 시각과 실제로 출근한 시각을 100으로 나눈 나머지는 59 이하입니다.
+// 테스트 케이스 구성 안내
+// 아래는 테스트 케이스 구성을 나타냅니다. 각 그룹 내의 테스트 케이스를 모두 통과하면 해당 그룹에 할당된 점수를 획득할 수 있습니다.
+
+// 그룹	총점	추가 제한 사항
+// #1	10%	n = 1. 이벤트 시작일이 월요일이고, 출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #2	10%	이벤트 시작일이 월요일이고, 출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #3	15%	출근 희망 시각이 정각으로 된 입력만 주어집니다.
+// #4	15%	이벤트 시작일이 월요일인 입력만 주어집니다.
+// #5	50%	제한사항 외 추가조건이 없습니다.
+
+// 입출력 예
+// schedules	timelogs	startday	result
+// [700, 800, 1100]	[[710, 2359, 1050, 700, 650, 631, 659], [800, 801, 805, 800, 759, 810, 809], [1105, 1001, 1002, 600, 1059, 1001, 1100]]	5	3
+// [730, 855, 700, 720]	[[710, 700, 650, 735, 700, 931, 912], [908, 901, 805, 815, 800, 831, 835], [705, 701, 702, 705, 710, 710, 711], [707, 731, 859, 913, 934, 931, 905]]	1	2
+
+
+// 입출력 예 #1
+// 이벤트를 시작한 날은 금요일입니다. 직원 3명의 일주일 간 출근 시각을 나타내면 다음과 같습니다.
+
+// 출근 희망 시각	출근 인정 시각
+// 7:00	7:10
+// 8:00	8:10
+// 11:00	11:10
+// 금	토	일	월	화	수	목
+// 7:10	23:59	10:50	7:00	6:50	6:31	6:59
+// 8:00	8:01	8:05	8:00	7:59	8:10	8:09
+// 11:05	10:01	10:02	6:00	10:59	10:01	11:00
+// 모든 직원이 평일에 늦지 않고 출근했습니다. 따라서 상품을 받을 직원은 3명입니다.
+
+
+// 입출력 예 #2
+// 이벤트를 시작한 날은 월요일입니다. 직원 4명의 일주일 간 출근 시각을 나타내면 다음과 같습니다. 취소선으로 표시된 시각이 출근이 필요한 평일에 지각한 날입니다.
+
+// 출근 희망 시각	출근 인정 시각
+// 7:30	7:40
+// 8:55	9:05
+// 7:00	7:10
+// 7:20	7:30
+// 월	화	수	목	금	토	일
+// 7:10	7:00	6:50	7:35	7:00	9:31	9:12
+// 9:08	9:01	8:05	8:15	8:00	8:31	8:35
+// 7:05	7:01	7:02	7:05	7:10	7:10	7:11
+// 7:07	7:31	8:59	9:13	9:34	9:31	9:05
+// 첫 번째, 세 번째 직원이 평일에 늦지 않고 출근했습니다. 따라서 상품을 받을 직원은 2명입니다.
+
+
+
+
+// 검색하면서 풀었음
+function solution(schedules, timelogs, startday) {
+  let answer = 0;
+
+  // 1. 출근 희망 시각 + 10분 계산 함수
+  const getMaxArrivalTime = (time) => time + 10;
+
+  // 2. 시작 요일을 기준으로 실제 요일에 맞게 출근 기록을 확인
+  for (let i = 0; i < timelogs.length; i++) {
+    let isPassed = true;
+
+    // 3. 각 직원의 출근 기록을 순회
+    for (let j = 0; j < 5; j++) {  // 평일 (월~금: 0~4)
+      const attendTime = timelogs[i][(startday + j - 1) % 7];
+      const scheduledTime = schedules[i];
+      const maxArrivalTime = getMaxArrivalTime(scheduledTime);
+      if (attendTime > maxArrivalTime) {
path: 조연경/프로그래머스_코딩 기초 트레이닝_Lv.1/난이도 상_유연근무제.js
user: login: yg5057
body: 헉..!
정답은 통과 되서 제대로 안 살펴봤습니당.. 다시 검토해볼게요~!
created_at: 2025-03-25T07:53:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,39 @@
+// 문제 설명
+// 한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
+
+// 한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
+
+// 제한사항
+// 3 ≤ number의 길이 ≤ 13
+// -1,000 ≤ number의 각 원소 ≤ 1,000
+// 서로 다른 학생의 정수 번호가 같을 수 있습니다.
+
+// 입출력 예
+// number	                    result
+// [-2, 3, 0, 2, -5]	        2
+// [-3, -2, -1, 0, 1, 2, 3]	  5
+// [-1, 1, -1, 1]	            0
+
+
+
+// ! 가은님 Tip - 조합 이용하기
+function getCombinations(arr, r) {
+  const results = [];
+  if (r === 1) return arr.map(v => [v]); // 1개만 뽑을 경우 각각 배열로 반환
+
+  arr.forEach((fixed, idx, origin) => {
+    const rest = origin.slice(idx + 1); // 현재 요소를 제외한 나머지 요소
+    const combinations = getCombinations(rest, r - 1); // 나머지 요소들 중에서 r - 1 개의 조합 구하기
+    const attached = combinations.map(combination => [fixed, ...combination]); // 현재 요소와 조합된 나머지 요소 합치기
+    results.push(...attached);
+  });
+
+  return results;
+}
+
path: 조연경/프로그래머스_코딩 기초 트레이닝_Lv.1/난이도 하_삼총사.js
user: login: yg5057
body: 가은님 블로그가 아주 도움됐습니다😘
created_at: 2025-03-25T07:55:48Z
author_association: CONTRIBUTOR

PR comments:
user: login: gaeunchoi
created_at: 2025-03-25T07:35:02Z
body: 그래도 오늘 할당량 다 푸셨네유 !! 점점 어려워질텐데 그래도 고민 많이 하다가 검색하는건 괜찮으니 열심히 하시면 됩니당 !!

author_association: CONTRIBUTOR
user: login: soyeon0116
created_at: 2025-03-25T07:45:08Z
body: 멋지십니다!! 고생많으셨어요!
author_association: CONTRIBUTOR
user: login: ksy21019
created_at: 2025-03-25T07:48:07Z
body: 오늘도 수고 많으셨습니다!! :)
author_association: CONTRIBUTOR
user: login: gaeunchoi
created_at: 2025-03-25T07:51:24Z
body: 오늘도 수고 많으셨습니당 !! 문제 많아서 힘드셨을텐데 여러풀이도 챙겨보시고 제가 말한것까지 귀찮았을텐데 공부해주셔서 감사합니다 ㅎㅅㅎ
author_association: CONTRIBUTOR