Skip to content
Merged
41 changes: 40 additions & 1 deletion Programmers/Level1/42889_실패율.js
Original file line number Diff line number Diff line change
@@ -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);
// 각 스테이지에 현재 도전중인 유저 = 스테이지에 도달했으나 클리어하지 못한 유저
Expand Down
30 changes: 30 additions & 0 deletions Programmers/Level2/12949_행렬의_곱셈.js
Original file line number Diff line number Diff line change
@@ -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;
}
26 changes: 26 additions & 0 deletions Programmers/Level2/12973_짝지어_제거하기.js
Original file line number Diff line number Diff line change
@@ -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;
}
51 changes: 51 additions & 0 deletions Programmers/Level2/49994_방문_길이.js
Original file line number Diff line number Diff line change
@@ -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;
}
48 changes: 47 additions & 1 deletion Programmers/Level2/76502_괄호_회전하기.js
Original file line number Diff line number Diff line change
@@ -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 = {
"{": "}",
"[": "]",
Expand All @@ -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++) {
Expand Down
5 changes: 4 additions & 1 deletion Programmers/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) |
Expand All @@ -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) |
Expand Down