diff --git "a/Programmers/Level1/42889_\354\213\244\355\214\250\354\234\250.js" "b/Programmers/Level1/42889_\354\213\244\355\214\250\354\234\250.js" index 69275ed..444c817 100644 --- "a/Programmers/Level1/42889_\354\213\244\355\214\250\354\234\250.js" +++ "b/Programmers/Level1/42889_\354\213\244\355\214\250\354\234\250.js" @@ -1,4 +1,43 @@ -function solution(N, stages) { +/* +⭐️ 문제 정보 ⭐️ +문제 : 42889 - 실패율 +레벨 : Level 1 +링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42889 +*/ + +// ANCHOR 2025.10.02 풀이 +function solution2(N, stages) { + // k번째 스테이지에 도전중인 플레이어를 구하기 + // N + 2 : 스테이지 번호가 1부터 시작 + 모두 통과한 플레이어도 커버하기 위함 + const stagePlayers = new Array(N + 2).fill(0); + for (const stage of stages) { + stagePlayers[stage]++; + } + + // 실패율 구하기 (여전히 도전중인 플레이어 / 도달한 적이 있는 플레이어) + const fails = {}; // 실패율 + let totalPlayers = stages.length; // 전체 플레이어의 수 + + for (let k = 1; k <= N; k++) { + if (stagePlayers[k] === 0) { + // 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0으로 정의한다. + fails[k] = 0; + } else { + fails[k] = stagePlayers[k] / totalPlayers; + totalPlayers -= stagePlayers[k]; + } + } + + // fails 정렬하기 + const answer = Object.entries(fails) + .sort(([_, failRate1], [__, failRate2]) => failRate2 - failRate1) + .map(([stageNum]) => Number(stageNum)); + + return answer; +} + +// ANCHOR 2024.02.28 풀이 +function solution1(N, stages) { // 각 스테이지에 도달한 유저 const stageArray = new Array(N).fill(0); // 각 스테이지에 현재 도전중인 유저 = 스테이지에 도달했으나 클리어하지 못한 유저 diff --git "a/Programmers/Level2/12949_\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.js" "b/Programmers/Level2/12949_\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.js" new file mode 100644 index 0000000..50c9524 --- /dev/null +++ "b/Programmers/Level2/12949_\355\226\211\353\240\254\354\235\230_\352\263\261\354\205\210.js" @@ -0,0 +1,30 @@ +/* +⭐️ 문제 정보 ⭐️ +문제 : 12949 - 행렬의 곱셈 +레벨 : Level 2 +링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12949 +*/ + +function solution(arr1, arr2) { + const row1 = arr1.length; + const col1 = arr1[0].length; + const row2 = arr2.length; + const col2 = arr2[0].length; + + // 결과를 저장할 배열 초기화 (row1 * col2) + const answer = []; + for (let cnt = 0; cnt < row1; cnt++) { + answer.push(new Array(col2).fill(0)); + } + + // 곱셈 시작 + for (let i = 0; i < row1; i++) { + for (let j = 0; j < col2; j++) { + for (let k = 0; k < col1; k++) { + answer[i][j] += arr1[i][k] * arr2[k][j]; + } + } + } + + return answer; +} diff --git "a/Programmers/Level2/12973_\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.js" "b/Programmers/Level2/12973_\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.js" new file mode 100644 index 0000000..de6f7c7 --- /dev/null +++ "b/Programmers/Level2/12973_\354\247\235\354\247\200\354\226\264_\354\240\234\352\261\260\355\225\230\352\270\260.js" @@ -0,0 +1,26 @@ +/* +⭐️ 문제 정보 ⭐️ +문제 : 12973 - 짝지어 제거하기 +레벨 : Level 2 +링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12973 +*/ + +function isEmpty(stack) { + return stack.length === 0; +} + +function solution(s) { + const stack = []; + + // 초기화 + for (const c of s) { + if (isEmpty(stack)) stack.push(c); + else { + const top = stack[stack.length - 1]; + if (c === top) stack.pop(); + else stack.push(c); + } + } + + return isEmpty(stack) ? 1 : 0; +} diff --git "a/Programmers/Level2/49994_\353\260\251\353\254\270_\352\270\270\354\235\264.js" "b/Programmers/Level2/49994_\353\260\251\353\254\270_\352\270\270\354\235\264.js" new file mode 100644 index 0000000..d2e4437 --- /dev/null +++ "b/Programmers/Level2/49994_\353\260\251\353\254\270_\352\270\270\354\235\264.js" @@ -0,0 +1,51 @@ +/* +⭐️ 문제 정보 ⭐️ +문제 : 49994 - 방문 길이 +레벨 : Level 2 +링크 : https://school.programmers.co.kr/learn/courses/30/lessons/49994 +*/ + +function isValidPos(pos) { + const { x, y } = pos; + return x >= -5 && x <= 5 && y >= -5 && y <= 5; +} + +// 명령어에 따라 업데이트 된 위치를 반환하는 함수 +function move(dir, pos) { + const { x, y } = pos; + + const result = { + U: { x, y: y - 1 }, + D: { x, y: y + 1 }, + R: { x: x + 1, y }, + L: { x: x - 1, y }, + }; + + const newPos = result[dir]; + if (isValidPos(newPos)) return newPos; + return null; +} + +function solution(dirs) { + let answer = 0; + const visited = new Set(); // 방문한 from-to 경로를 저장하는 set + let pos = { x: 0, y: 0 }; + + for (const dir of dirs) { + const newPos = move(dir, pos); + if (!newPos) continue; + + const path = `${pos.x},${pos.y}-${newPos.x},${newPos.y}`; + const oppositePath = `${newPos.x},${newPos.y}-${pos.x},${pos.y}`; + + if (!visited.has(path)) { + visited.add(path); + visited.add(oppositePath); + answer++; + } + + pos = newPos; + } + + return answer; +} diff --git "a/Programmers/Level2/76502_\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.js" "b/Programmers/Level2/76502_\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.js" index 66a0b4c..d0d691b 100644 --- "a/Programmers/Level2/76502_\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.js" +++ "b/Programmers/Level2/76502_\352\264\204\355\230\270_\355\232\214\354\240\204\355\225\230\352\270\260.js" @@ -1,3 +1,49 @@ +/* +⭐️ 문제 정보 ⭐️ +문제 : 76502 - 괄호 회전하기 +레벨 : Level 2 +링크 : https://school.programmers.co.kr/learn/courses/30/lessons/76502 +*/ + +//ANCHOR 2025.10.02 풀이 +function solution2(s) { + let answer = 0; + const n = s.length; + const rotated = s + s; // 문자열을 두 번 이어붙이기 + + for (let start = 0; start < n; start++) { + const stack = []; + let isValid = true; + for (let offset = 0; offset < n; offset++) { + // 회전하기 + const c = rotated[start + offset]; + + // 여는 괄호인 경우 push + if (c === "(" || c === "[" || c === "{") { + stack.push(c); + continue; + } + // 스택이 비어있는 경우 다음 회전 문자열을 비교하러 감 + if (stack.length === 0) { + isValid = false; + break; + } + // 닫는 괄호인 경우 top과 비교 + const top = stack.pop(); + if (c === ")" && top === "(") continue; + if (c === "]" && top === "[") continue; + if (c === "}" && top === "{") continue; + isValid = false; + break; + } + if (isValid && stack.length === 0) answer++; + } + + return answer; +} + +// ANCHOR 2024.02.22 풀이 + const bracket = { "{": "}", "[": "]", @@ -17,7 +63,7 @@ function isRightBracket(s) { return stack.length === 0; // 짝이 맞지 않는 경우는 올바른 괄호가 아니다. } -function solution(s) { +function solution1(s) { let answer = 0; const stringArr = s.split(""); for (let i = 0; i < stringArr.length; i++) { diff --git a/Programmers/README.md b/Programmers/README.md index 3938bd8..b620ba5 100644 --- a/Programmers/README.md +++ b/Programmers/README.md @@ -11,6 +11,8 @@ | 12924 | 숫자의 표현 | [12924_숫자의_표현.js](Level2/12924_숫자의_표현.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12924) | | 12939 | 최댓값과 최솟값 | [12939_최댓값과_최솟값.js](Level2/12939_최댓값과_최솟값.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12939) | | 12941 | 최솟값 만들기 | [12941_최솟값_만들기.js](Level2/12941_최솟값_만들기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12941) | +| 12949 | 행렬의 곱셈 | [12949_행렬의_곱셈.js](Level2/12949_행렬의_곱셈.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12949) | +| 12973 | 짝지어 제거하기 | [12973_짝지어_제거하기.js](Level2/12973_짝지어_제거하기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12973) | | 12987 | 숫자 게임 | [12987_숫자_게임.js](Level3/12987_숫자_게임.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12987) | | 17677 | [1차] 뉴스 클러스터링 | [17677_[1차]_뉴스_클러스터링.js](Level2/17677_[1차]_뉴스_클러스터링.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/17677) | | 17678 | [1차] 셔틀버스 | [17678_[1차]_셔틀버스.js](Level3/17678_[1차]_셔틀버스.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/17678) | @@ -20,8 +22,9 @@ | 42584 | 주식가격 | [42584_주식가격.js](Level2/42584_주식가격.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42584) | | 42840 | 모의고사 | [42840_모의고사.js](Level1/42840_모의고사.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42840) | | 42888 | 오픈채팅방 | [42888_오픈채팅방.js](Level2/42888_오픈채팅방.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42888) | -| 42889 | 실패율 | [42889_실패율.js](Level1/42889_실패율.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42889) | +| 42889 | 실패율 | [42889_실패율.js](Level1/42889_실패율.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42889) | | 49993 | 스킬트리 | [49993_스킬트리.js](Level2/49993_스킬트리.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/49993) | +| 49994 | 방문 길이 | [49994_방문_길이.js](Level2/49994_방문_길이.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/49994) | | 60057 | 문자열 압축 | [60057_문자열_압축.js](Level2/60057_문자열_압축.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/60057) | | 60062 | 외벽 점검 | [60062_외벽_점검.js](60062_외벽_점검.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/60062) | | 64061 | 크레인 인형뽑기 게임 | [64061_크레인_인형뽑기_게임.js](Level1/64061_크레인_인형뽑기_게임.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/64061) |