Skip to content
Merged
Show file tree
Hide file tree
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
26 changes: 26 additions & 0 deletions Programmers/Level0/120853_컨트롤_제트.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
⭐️ 문제 정보 ⭐️
문제 : 120853 - 컨트롤 제트
레벨 : Level 0
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/120853
*/

function solution(s) {
let answer = 0;
const arr = s.split(" ");

for (let idx = 0; idx < arr.length; idx++) {
if (arr[idx] === "Z") {
// 직전 숫자를 빼 준다.
// s는 "Z"로 시작하지 않습니다.
// "Z"가 연속해서 나오는 경우는 없습니다.
answer -= arr[idx - 1];
} else {
// 숫자로 변환해서 더해준다.
// s는 숫자, "Z", 공백으로 이루어져 있습니다.
answer += Number(arr[idx]);
}
}

return answer;
}
20 changes: 20 additions & 0 deletions Programmers/Level1/12906_같은_숫자는_싫어.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
⭐️ 문제 정보 ⭐️
문제 : 12906 - 같은 숫자는 싫어
레벨 : Level 1
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12906
*/

function solution(arr) {
const answer = [];

for (const num of arr) {
if (answer.length > 0 && answer[answer.length - 1] === num) {
// 연속으로 등장한 경우 그냥 넘어간다
continue;
}
answer.push(num);
}

return answer;
}
27 changes: 27 additions & 0 deletions Programmers/Level1/159994_카드_뭉치.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
⭐️ 문제 정보 ⭐️
문제 : 159994 - 카드 뭉치
레벨 : Level 1
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/159994
*/

function solution(cards1, cards2, goal) {
let idx1 = 0;
let idx2 = 0;
let goalIdx = 0;

while (goalIdx < goal.length) {
if (idx1 < cards1.length && cards1[idx1] === goal[goalIdx]) {
goalIdx++;
idx1++;
continue;
} else if (idx2 < cards2.length && cards2[idx2] === goal[goalIdx]) {
goalIdx++;
idx2++;
continue;
}
return "No";
}

return "Yes";
}
21 changes: 20 additions & 1 deletion Programmers/Level2/12909_올바른_괄호.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,26 @@
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12909
*/

function solution(s) {
// ANCHOR 2025.10.04 풀이
function solution2(s) {
let stackSize = 0;

for (const c of s) {
if (c === "(") {
// 여는 괄호인 경우 스택에 넣는다
stackSize++; // 괄호 종류가 하나 뿐이므로 직접 스택에 데이터를 넣을 필요가 없음
} else {
// 닫는 괄호인 경우 스택에서 뺀다
if (stackSize === 0) return false;
stackSize--;
}
}

return stackSize === 0;
}

// ANCHOR 2024.12.19 풀이
function solution1(s) {
let answer = true;
let stackSize = 0;

Expand Down
30 changes: 30 additions & 0 deletions Programmers/Level2/42586_기능개발.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
⭐️ 문제 정보 ⭐️
문제 : 42586 - 기능개발
레벨 : Level 2
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42586
*/

function solution(progresses, speeds) {
let answer = [];
let front = 0; // 현 시점 배포되어야 하는 작업
let day = 0;

while (front < progresses.length) {
// frontProgress를 배포하기 위해서 필요한 일 수
const requiredDay = Math.ceil((100 - progresses[front]) / speeds[front]);
// requiredDay와 day중 큰 값으로 업데이트해준다 (frontProgress를 배포하기 위해서 배포 없이 하루를 보낼 수 있음)
day = Math.max(requiredDay, day);
let deployCnt = 1;
while (++front < progresses.length) {
if (progresses[front] + speeds[front] * day < 100) {
// 오늘 다음 작업도 함께 배포할 수 없다면 넘어간다
break;
}
// 함께 배포해주기
deployCnt++;
}
answer.push(deployCnt);
}
return answer;
}
132 changes: 132 additions & 0 deletions Programmers/Level3/81303_표_편집.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
/*
⭐️ 문제 정보 ⭐️
문제 : 81303 - 표 편집
레벨 : Level 3
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/81303
*/

/**
* NOTE: 2025.10.04
* - rows를 배열로 관리해서 시간 초과 발생함
* - 이중 연결 리스트로 구현해서 해결 완료
*/

// ANCHOR - 2025.10.04 풀이 - 이중 연결 리스트
function solution2(n, k, cmd) {
// 각 노드가 가리키는 prev와 next를 저장하는 배열 (이중 연결 리스트)
const prev = Array.from({ length: n }, (_, i) => i - 1);
const next = Array.from({ length: n }, (_, i) => i + 1);

const deleteHistory = [];
const deleted = new Array(n).fill(false); // 정답 생성 위해서 삭제된 행 따로 관리
let cursor = k;

for (const c of cmd) {
const op = c[0];

switch (op) {
case "U":
const upSteps = parseInt(c.split(" ")[1]);
for (let cnt = 0; cnt < upSteps; cnt++) {
cursor = prev[cursor];
}
break;
case "D":
const downSteps = parseInt(c.split(" ")[1]);
for (let cnt = 0; cnt < downSteps; cnt++) {
cursor = next[cursor];
}
break;
case "C":
deleteHistory.push(cursor);
deleted[cursor] = true;

const prevNode = prev[cursor];
const nextNode = next[cursor];

// 연결 끊기
if (prevNode !== -1) next[prevNode] = nextNode;
if (nextNode !== -1) prev[nextNode] = prevNode;

// 다음 커서 업데이트
cursor = nextNode !== n ? nextNode : prevNode;
break;
case "Z":
const currentDelete = deleteHistory.pop();
deleted[currentDelete] = false;
const prevNode_ = prev[currentDelete];
const nextNode_ = next[currentDelete];

// 연결 복구
if (prevNode_ !== -1) next[prevNode_] = currentDelete;
if (nextNode_ !== -1) prev[nextNode_] = currentDelete;
break;
default:
}
}

// 결과 생성하기 (삭제된 것만 X로 바꿔줄것임)
const result = new Array(n).fill("O");
for (let row = 0; row < deleted.length; row++) {
if (deleted[row]) result[row] = "X";
}
return result.join("");
}

// ANCHOR - 2025.10.04 풀이 - 배열
function findNextExistingRow(rows, start, direction, n) {
let idx = start;
while (idx >= 0 && idx < n && rows[idx] === false) {
idx += direction;
}
return idx;
}

function solution1(n, k, cmd) {
const rows = new Array(n).fill(true); // 행의 존재 여부를 저장
const deleteHistory = [];
let cursor = k;

for (const c of cmd) {
const op = c[0];

switch (op) {
case "U":
// X칸 위에 있는 행 선택 (범위 고려 x)
const [u, ux] = c.split(" ");
const upSteps = parseInt(ux);
for (let cnt = 0; cnt < upSteps; cnt++) {
cursor = findNextExistingRow(rows, cursor - 1, -1, n);
}
break;
case "D":
// X칸 아래에 있는 행 선택 (범위 고려 x)
const [d, ud] = c.split(" ");
const downSteps = parseInt(ud);
for (let cnt = 0; cnt < downSteps; cnt++) {
cursor = findNextExistingRow(rows, cursor + 1, 1, n);
}
break;
case "C":
// 현재 선택한 행 삭제
deleteHistory.push(cursor);
rows[cursor] = false;
// 바로 아래 행 선택
let nextCursor = findNextExistingRow(rows, cursor + 1, 1, n);
// 가장 아래 행을 삭제한 경우에는 바로 위 행 선택
if (nextCursor >= n) {
nextCursor = findNextExistingRow(rows, cursor - 1, -1, n);
}
cursor = nextCursor;
break;
case "Z":
// 가장 최근에 삭제한 행을 원래대로 복구
const currentDelete = deleteHistory.pop();
rows[currentDelete] = true;
break;
default:
}
}

return rows.map((isExist) => (isExist ? "O" : "X")).join("");
}
5 changes: 5 additions & 0 deletions Programmers/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
| 문제 번호 | 문제 이름 | 풀이 코드 | 문제 링크 |
| --------- | --------- | --------- | --------- |
| 1845 | 폰켓몬 | [1845_폰켓몬.js](Level1/1845_폰켓몬.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/1845) |
| 12906 | 같은 숫자는 싫어 | [12906_같은_숫자는_싫어.js](Level1/12906_같은_숫자는_싫어.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12906) |
| 12909 | 올바른 괄호 | [12909_올바른_괄호.js](Level2/12909_올바른_괄호.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12909) |
| 12910 | 나누어 떨어지는 숫자 배열 | [12910_나누어_떨어지는_숫자_배열.js](Level1/12910_나누어_떨어지는_숫자_배열.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12910) |
| 12924 | 숫자의 표현 | [12924_숫자의_표현.js](Level2/12924_숫자의_표현.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/12924) |
Expand All @@ -21,6 +22,7 @@
| 17686 | [3차] 파일명 정렬 | [17686_[3차]_파일명_정렬.js](Level2/17686_[3차]_파일명_정렬.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/17686) |
| 17687 | n진수 게임 | [17687_n진수_게임.js](Level2/17687_n진수_게임.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/17687) |
| 42584 | 주식가격 | [42584_주식가격.js](Level2/42584_주식가격.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42584) |
| 42586 | 기능개발 | [42586_기능개발.js](Level2/42586_기능개발.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/42586) |
| 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) |
Expand All @@ -43,6 +45,7 @@
| 76502 | 괄호 회전하기 | [76502_괄호_회전하기.js](Level2/76502_괄호_회전하기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/76502) |
| 77484 | 로또의 최고 순위와 최저 순위 | [77484_로또의_최고_순위와_최저_순위.js](Level1/77484_로또의_최고_순위와_최저_순위.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/77484) |
| 77885 | 2개 이하로 다른 비트 | [77885_2개_이하로_다른_비트.js](Level2/77885_2개_이하로_다른_비트.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/77885) |
| 81303 | 표 편집 | [81303_표_편집.js](Level3/81303_표_편집.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/81303) |
| 87390 | n^2 배열 자르기 | [87390_n^2_배열_자르기.js](Level2/87390_n^2_배열_자르기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/87390) |
| 92334 | 신고 결과 받기 | [92334_신고_결과_받기.js](Level1/92334_신고_결과_받기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/92334) |
| 92341 | 주차 요금 계산 | [92341_주차_요금_계산.js](Level2/92341_주차_요금_계산.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/92341) |
Expand All @@ -51,8 +54,10 @@
| 118669 | 등산코스 정하기 | [118669_등산코스_정하기.js](118669_등산코스_정하기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/118669) |
| 120817 | 배열의 평균값 | [120817_배열의_평균값.js](Level0/120817_배열의_평균값.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/120817) |
| 120821 | 배열 뒤집기 | [120821_배열_뒤집기.js](Level0/120821_배열_뒤집기.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/120821) |
| 120853 | 컨트롤 제트 | [120853_컨트롤_제트.js](Level0/120853_컨트롤_제트.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/120853) |
| 121683 | 외톨이 알파벳.cpp | [121683_외톨이_알파벳.cpp](Unrated/121683_외톨이_알파벳.cpp) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/121683) |
| 121683 | 외톨이 알파벳 | [121683_외톨이_알파벳.js](Unrated/121683_외톨이_알파벳.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/121683) |
| 150370 | 개인정보 수집 유효기간 | [150370_개인정보_수집_유효기간.js](Level1/150370_개인정보_수집_유효기간.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/150370) |
| 159994 | 카드 뭉치 | [159994_카드_뭉치.js](Level1/159994_카드_뭉치.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/159994) |
| 258711 | 도넛과 막대 그래프 | [258711_도넛과_막대_그래프.js](Level2/258711_도넛과_막대_그래프.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/258711) |
| 340212 | [PCCP 기출문제] 2번 퍼즐 게임 챌린지 | [340212_[PCCP_기출문제]_2번_퍼즐_게임_챌린지.js](Level2/340212_[PCCP_기출문제]_2번_퍼즐_게임_챌린지.js) | [🔗](https://school.programmers.co.kr/learn/courses/30/lessons/340212) |