From febb4749958cbb2fc196f806b98649bc32b9c31a Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Wed, 5 Apr 2023 14:03:00 +0900
Subject: [PATCH 01/11] =?UTF-8?q?[level=200]=20Title:=20=EB=91=90=20?=
=?UTF-8?q?=EC=88=98=EC=9D=98=20=EC=B0=A8,=20Time:=200.03=20ms,=20Memory:?=
=?UTF-8?q?=2033.4=20MB=20-BaekjoonHub?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md" | 69 +++++++++++++++++++
...30\354\235\230\342\200\205\354\260\250.js" | 3 +
2 files changed, 72 insertions(+)
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md"
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js"
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md"
new file mode 100644
index 0000000..e67a378
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md"
@@ -0,0 +1,69 @@
+# [level 0] 두 수의 차 - 120803
+
+[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/120803)
+
+### 성능 요약
+
+메모리: 33.4 MB, 시간: 0.03 ms
+
+### 구분
+
+코딩테스트 연습 > 코딩테스트 입문
+
+### 채점결과
+
+
정확성: 100.0
합계: 100.0 / 100.0
+
+### 문제 설명
+
+
정수 num1과 num2가 주어질 때, num1에서 num2를 뺀 값을 return하도록 soltuion 함수를 완성해주세요.
+
+
+
+제한사항
+
+
+- -50000 ≤
num1 ≤ 50000
+- -50000 ≤
num2 ≤ 50000
+
+
+
+
+입출력 예
+
+
+| num1 |
+num2 |
+result |
+
+
+
+| 2 |
+3 |
+-1 |
+
+
+| 100 |
+2 |
+98 |
+
+
+
+
+
+입출력 예 설명
+
+입출력 예 #1
+
+
+num1이 2이고 num2가 3이므로 2 - 3 = -1을 return합니다.
+
+
+입출력 예 #2
+
+
+num1이 100이고 num2가 2이므로 100 - 2 = 98을 return합니다.
+
+
+
+> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
\ No newline at end of file
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js"
new file mode 100644
index 0000000..2dff566
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js"
@@ -0,0 +1,3 @@
+function solution(num1, num2) {
+ return num1 - num2
+}
\ No newline at end of file
From 5f51291e47e5427aa4249a406c600f698edc2ee3 Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Wed, 5 Apr 2023 22:11:16 +0900
Subject: [PATCH 02/11] =?UTF-8?q?[level=203]=20Title:=20=EC=B9=B4=EB=93=9C?=
=?UTF-8?q?=20=EC=A7=9D=20=EB=A7=9E=EC=B6=94=EA=B8=B0,=20Time:=207.70=20ms?=
=?UTF-8?q?,=20Memory:=2038.7=20MB=20-BaekjoonHub?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md" | 133 ++++++++++++++++++
...05\353\247\236\354\266\224\352\270\260.js" | 85 +++++++++++
2 files changed, 218 insertions(+)
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/README.md"
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260.js"
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/README.md" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/README.md"
new file mode 100644
index 0000000..86e88fa
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/README.md"
@@ -0,0 +1,133 @@
+# [level 3] 카드 짝 맞추기 - 72415
+
+[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/72415)
+
+### 성능 요약
+
+메모리: 38.7 MB, 시간: 7.70 ms
+
+### 구분
+
+코딩테스트 연습 > 2021 KAKAO BLIND RECRUITMENT
+
+### 채점결과
+
+
정확성: 100.0
합계: 100.0 / 100.0
+
+### 문제 설명
+
+게임 개발자인 베로니는 개발 연습을 위해 다음과 같은 간단한 카드 짝맞추기 보드 게임을 개발해 보려고 합니다.
+게임이 시작되면 화면에는 카드 16장이 뒷면을 위로하여 4 x 4 크기의 격자 형태로 표시되어 있습니다. 각 카드의 앞면에는 카카오프렌즈 캐릭터 그림이 그려져 있으며, 8가지의 캐릭터 그림이 그려진 카드가 각기 2장씩 화면에 무작위로 배치되어 있습니다.
+유저가 카드를 2장 선택하여 앞면으로 뒤집었을 때 같은 그림이 그려진 카드면 해당 카드는 게임 화면에서 사라지며, 같은 그림이 아니라면 원래 상태로 뒷면이 보이도록 뒤집힙니다. 이와 같은 방법으로 모든 카드를 화면에서 사라지게 하면 게임이 종료됩니다.
+
+게임에서 카드를 선택하는 방법은 다음과 같습니다.
+
+
+- 카드는
커서를 이용해서 선택할 수 있습니다.
+
+
+- 커서는 4 x 4 화면에서 유저가 선택한 현재 위치를 표시하는 "굵고 빨간 테두리 상자"를 의미합니다.
+
+- 커서는 [Ctrl] 키와 방향키에 의해 이동되며 키 조작법은 다음과 같습니다.
+
+
+- 방향키 ←, ↑, ↓, → 중 하나를 누르면, 커서가 누른 키 방향으로 1칸 이동합니다.
+- [Ctrl] 키를 누른 상태에서 방향키 ←, ↑, ↓, → 중 하나를 누르면, 누른 키 방향에 있는 가장 가까운 카드로 한번에 이동합니다.
+
+
+- 만약, 해당 방향에 카드가 하나도 없다면 그 방향의 가장 마지막 칸으로 이동합니다.
+
+- 만약, 누른 키 방향으로 이동 가능한 카드 또는 빈 공간이 없어 이동할 수 없다면 커서는 움직이지 않습니다.
+
+- 커서가 위치한 카드를 뒤집기 위해서는 [Enter] 키를 입력합니다.
+
+
+- [Enter] 키를 입력해서 카드를 뒤집었을 때
+
+
+- 앞면이 보이는 카드가 1장 뿐이라면 그림을 맞출 수 없으므로 두번째 카드를 뒤집을 때 까지 앞면을 유지합니다.
+- 앞면이 보이는 카드가 2장이 된 경우, 두개의 카드에 그려진 그림이 같으면 해당 카드들이 화면에서 사라지며, 그림이 다르다면 두 카드 모두 뒷면이 보이도록 다시 뒤집힙니다.
+
+
+
+
+"베로니"는 게임 진행 중 카드의 짝을 맞춰 몇 장 제거된 상태에서 카드 앞면의 그림을 알고 있다면, 남은 카드를 모두 제거하는데 필요한 키 조작 횟수의 최솟값을 구해 보려고 합니다. 키 조작 횟수는 방향키와 [Enter] 키를 누르는 동작을 각각 조작 횟수 1로 계산하며, [Ctrl] 키와 방향키를 함께 누르는 동작 또한 조작 횟수 1로 계산합니다.
+
+다음은 카드가 몇 장 제거된 상태의 게임 화면에서 커서를 이동하는 예시입니다.
+아래 그림에서 빈 칸은 이미 카드가 제거되어 없어진 칸을 의미하며, 그림이 그려진 칸은 카드 앞 면에 그려진 그림을 나타냅니다.
+
+
+예시에서 커서는 두번째 행, 첫번째 열 위치에서 시작하였습니다.
+
+[Enter] 입력, ↓ 이동, [Ctrl]+→ 이동, [Enter] 입력 = 키 조작 4회
+
+[Ctrl]+↑ 이동, [Enter] 입력, [Ctrl]+← 이동, [Ctrl]+↓ 이동, [Enter] 입력 = 키 조작 5회
+
+[Ctrl]+→ 이동, [Enter] 입력, [Ctrl]+↑ 이동, [Ctrl]+← 이동, [Enter] 입력 = 키 조작 5회
+
+위와 같은 방법으로 커서를 이동하여 카드를 선택하고 그림을 맞추어 카드를 모두 제거하기 위해서는 총 14번(방향 이동 8번, [Enter] 키 입력 6번)의 키 조작 횟수가 필요합니다.
+
+
+
+[문제]
+
+현재 카드가 놓인 상태를 나타내는 2차원 배열 board와 커서의 처음 위치 r, c가 매개변수로 주어질 때, 모든 카드를 제거하기 위한 키 조작 횟수의 최솟값을 return 하도록 solution 함수를 완성해 주세요.
+
+[제한사항]
+
+
+- board는 4 x 4 크기의 2차원 배열입니다.
+- board 배열의 각 원소는 0 이상 6 이하인 자연수입니다.
+
+
+- 0은 카드가 제거된 빈 칸을 나타냅니다.
+- 1 부터 6까지의 자연수는 2개씩 들어있으며 같은 숫자는 같은 그림의 카드를 의미합니다.
+- 뒤집을 카드가 없는 경우(board의 모든 원소가 0인 경우)는 입력으로 주어지지 않습니다.
+
+- r은 커서의 최초 세로(행) 위치를 의미합니다.
+- c는 커서의 최초 가로(열) 위치를 의미합니다.
+- r과 c는 0 이상 3 이하인 정수입니다.
+- 게임 화면의 좌측 상단이 (0, 0), 우측 하단이 (3, 3) 입니다.
+
+
+
+
+[입출력 예]
+
+
+| board |
+r |
+c |
+result |
+
+
+
+| [[1,0,0,3],[2,0,0,0],[0,0,0,2],[3,0,1,0]] |
+1 |
+0 |
+14 |
+
+
+| [[3,0,0,2],[0,0,1,0],[0,1,0,0],[2,0,0,3]] |
+0 |
+1 |
+16 |
+
+
+
+입출력 예에 대한 설명
+
+
+
+입출력 예 #1
+문제의 예시와 같습니다.
+
+입출력 예 #2
+입력으로 주어진 게임 화면은 아래 그림과 같습니다.
+
+
+
+위 게임 화면에서 모든 카드를 제거하기 위한 키 조작 횟수의 최솟값은 16번 입니다.
+
+
+> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
\ No newline at end of file
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260.js" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260.js"
new file mode 100644
index 0000000..e42d86c
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260.js"
@@ -0,0 +1,85 @@
+const solution = (board, r, c) => {
+ // 출처 : https://www.youtube.com/watch?v=Q4bTSdi1psw&t=2s
+ const bfs = (visited, src, dst) => {
+ const out = (x, y) => x < 0 || x > 3 || y < 0 || y > 3;
+
+ const dir = [
+ [-1, 0],
+ [1, 0],
+ [0, -1],
+ [0, 1],
+ ];
+
+ const graph = Array.from({ length: 4 }, () => Array(4).fill(false));
+ const queue = [[...src, 0]];
+
+ while (queue.length) {
+ const [y, x, cnt] = queue.shift();
+ if (y === dst[0] && x === dst[1]) {
+ return cnt;
+ }
+ for (const [dy, dx] of dir) {
+ let [ny, nx] = [y + dy, x + dx];
+
+ if (out(ny, nx)) continue;
+
+ if (!graph[ny][nx]) {
+ graph[ny][nx] = true;
+ queue.push([ny, nx, cnt + 1]);
+ }
+
+ for (let i = 0; i < 2; i++) {
+ if (!(visited & (1 << board[ny][nx]))) break;
+ if (out(ny + dy, nx + dx)) break;
+
+ [ny, nx] = [ny + dy, nx + dx];
+ }
+ if (!graph[ny][nx]) {
+ graph[ny][nx] = true;
+ queue.push([ny, nx, cnt + 1]);
+ }
+ }
+ }
+
+ return Infinity;
+ };
+
+ const permutate = (cnt, visited, src) => {
+ if (visited === allVisited) {
+ answer = Math.min(answer, cnt);
+ return;
+ }
+ for (const [card, pos] of card_pos.entries()) {
+ if (visited & (1 << card)) continue;
+
+ const first =
+ bfs(visited, src, pos[0]) + bfs(visited, pos[0], pos[1]) + 2;
+ const second =
+ bfs(visited, src, pos[1]) + bfs(visited, pos[1], pos[0]) + 2;
+
+ permutate(cnt + first, visited | (1 << card), pos[1]);
+ permutate(cnt + second, visited | (1 << card), pos[0]);
+ }
+ };
+
+ const card_pos = new Map();
+
+ let allVisited = 1;
+ let answer = Infinity;
+
+ board.forEach((row, y) => {
+ row.forEach((card, x) => {
+ if (!card) return;
+
+ if (card_pos.has(card)) {
+ card_pos.get(card).push([y, x]);
+ return;
+ }
+ card_pos.set(card, [[y, x]]);
+ allVisited |= 1 << card;
+ });
+ });
+
+ permutate(0, 1, [r, c]);
+ return answer;
+};
\ No newline at end of file
From 6295686628dc7ea3690f231167d3202fbdfee943 Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Thu, 6 Apr 2023 09:43:02 +0900
Subject: [PATCH 03/11] =?UTF-8?q?[level=203]=20Title:=20=EC=82=AC=EB=9D=BC?=
=?UTF-8?q?=EC=A7=80=EB=8A=94=20=EB=B0=9C=ED=8C=90,=20Time:=200.24=20ms,?=
=?UTF-8?q?=20Memory:=2033.4=20MB=20-BaekjoonHub?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md" | 175 ++++++++++++++++++
...24\342\200\205\353\260\234\355\214\220.js" | 50 +++++
2 files changed, 225 insertions(+)
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/README.md"
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220.js"
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/README.md" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/README.md"
new file mode 100644
index 0000000..fac6952
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/README.md"
@@ -0,0 +1,175 @@
+# [level 3] 사라지는 발판 - 92345
+
+[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/92345)
+
+### 성능 요약
+
+메모리: 33.4 MB, 시간: 0.24 ms
+
+### 구분
+
+코딩테스트 연습 > 2022 KAKAO BLIND RECRUITMENT
+
+### 채점결과
+
+
정확성: 100.0
합계: 100.0 / 100.0
+
+### 문제 설명
+
+문제 설명
+
+플레이어 A와 플레이어 B가 서로 게임을 합니다. 당신은 이 게임이 끝날 때까지 양 플레이어가 캐릭터를 몇 번 움직이게 될지 예측하려고 합니다.
+
+각 플레이어는 자신의 캐릭터 하나를 보드 위에 올려놓고 게임을 시작합니다. 게임 보드는 1x1 크기 정사각 격자로 이루어져 있으며, 보드 안에는 발판이 있는 부분과 없는 부분이 있습니다. 발판이 있는 곳에만 캐릭터가 서있을 수 있으며, 처음 캐릭터를 올려놓는 곳은 항상 발판이 있는 곳입니다. 캐릭터는 발판이 있는 곳으로만 이동할 수 있으며, 보드 밖으로 이동할 수 없습니다. 밟고 있던 발판은 그 위에 있던 캐릭터가 다른 곳으로 이동하여 다른 발판을 밞음과 동시에 사라집니다. 양 플레이어는 번갈아가며 자기 차례에 자신의 캐릭터를 상하좌우로 인접한 4개의 칸 중에서 발판이 있는 칸으로 옮겨야 합니다.
+
+다음과 같은 2가지 상황에서 패자와 승자가 정해지며, 게임이 종료됩니다.
+
+
+- 움직일 차례인데 캐릭터의 상하좌우 주변 4칸이 모두 발판이 없거나 보드 밖이라서 이동할 수 없는 경우, 해당 차례 플레이어는 패배합니다.
+- 두 캐릭터가 같은 발판 위에 있을 때, 상대 플레이어의 캐릭터가 다른 발판으로 이동하여 자신의 캐릭터가 서있던 발판이 사라지게 되면 패배합니다.
+
+
+게임은 항상 플레이어 A가 먼저 시작합니다. 양 플레이어는 최적의 플레이를 합니다. 즉, 이길 수 있는 플레이어는 최대한 빨리 승리하도록 플레이하고, 질 수밖에 없는 플레이어는 최대한 오래 버티도록 플레이합니다. '이길 수 있는 플레이어'는 실수만 하지 않는다면 항상 이기는 플레이어를 의미하며, '질 수밖에 없는 플레이어'는 최선을 다해도 상대가 실수하지 않으면 항상 질 수밖에 없는 플레이어를 의미합니다. 최대한 오래 버틴다는 것은 양 플레이어가 캐릭터를 움직이는 횟수를 최대화한다는 것을 의미합니다.
+
+아래 그림은 초기 보드의 상태와 각 플레이어의 위치를 나타내는 예시입니다.
+
+
+
+위와 같은 경우, 플레이어 A는 실수만 하지 않는다면 항상 이길 수 있습니다. 따라서 플레이어 A는 이길 수 있는 플레이어이며, B는 질 수밖에 없는 플레이어입니다. 다음은 A와 B가 최적의 플레이를 하는 과정을 나타냅니다.
+
+
+- 플레이어 A가 초기 위치 (1, 0)에서 (1, 1)로 이동합니다. 플레이어 A가 (0, 0)이나 (2, 0)으로 이동할 경우 승리를 보장할 수 없습니다. 따라서 무조건 이길 방법이 있는 (1, 1)로 이동합니다.
+- 플레이어 B는 (1, 1)로 이동할 경우, 바로 다음 차례에 A가 위 또는 아래 방향으로 이동하면 발판이 없어져 패배하게 됩니다. 질 수밖에 없는 플레이어는 최대한 오래 버티도록 플레이하기 때문에 (1, 1)로 이동하지 않습니다. (1, 2)에서 위쪽 칸인 (0, 2)로 이동합니다.
+- A가 (1, 1)에서 (0, 1)로 이동합니다.
+- B에게는 남은 선택지가 (0, 1)밖에 없습니다. 따라서 (0, 2)에서 (0, 1)로 이동합니다.
+- A가 (0, 1)에서 (0, 0)으로 이동합니다. 이동을 완료함과 동시에 B가 서있던 (0, 1)의 발판이 사라집니다. B가 패배합니다.
+- 만약 과정 2에서 B가 아래쪽 칸인 (2, 2)로 이동하더라도 A는 (2, 1)로 이동하면 됩니다. 이후 B가 (2, 1)로 이동, 다음 차례에 A가 (2, 0)으로 이동하면 B가 패배합니다.
+
+
+위 예시에서 양 플레이어가 최적의 플레이를 했을 경우, 캐릭터의 이동 횟수 합은 5입니다. 최적의 플레이를 하는 방법은 여러 가지일 수 있으나, 이동한 횟수는 모두 5로 같습니다.
+
+게임 보드의 초기 상태를 나타내는 2차원 정수 배열 board와 플레이어 A의 캐릭터 초기 위치를 나타내는 정수 배열 aloc, 플레이어 B의 캐릭터 초기 위치를 나타내는 정수 배열 bloc이 매개변수로 주어집니다. 양 플레이어가 최적의 플레이를 했을 때, 두 캐릭터가 움직인 횟수의 합을 return 하도록 solution 함수를 완성해주세요.
+
+
+
+제한사항
+
+
+- 1 ≤
board의 세로 길이 ≤ 5
+- 1 ≤
board의 가로 길이 ≤ 5
+board의 원소는 0 또는 1입니다.
+
+
+- 0은 발판이 없음을, 1은 발판이 있음을 나타냅니다.
+- 게임 보드의 좌측 상단 좌표는 (0, 0), 우측 하단 좌표는 (
board의 세로 길이 - 1, board의 가로 길이 - 1)입니다.
+
+aloc과 bloc은 각각 플레이어 A의 캐릭터와 플레이어 B의 캐릭터 초기 위치를 나타내는 좌표값이며 [r, c] 형태입니다.
+
+
+- r은 몇 번째 행인지를 나타냅니다.
+- 0 ≤ r <
board의 세로 길이
+- c는 몇 번째 열인지를 나타냅니다.
+- 0 ≤ c <
board의 가로 길이
+- 초기 보드의
aloc과 bloc 위치는 항상 발판이 있는 곳입니다.
+aloc과 bloc이 같을 수 있습니다.
+
+- 상대 플레이어의 캐릭터가 있는 칸으로 이동할 수 있습니다.
+
+
+
+
+입출력 예
+
+
+| board |
+aloc |
+bloc |
+result |
+
+
+
+| [[1, 1, 1], [1, 1, 1], [1, 1, 1]] |
+[1, 0] |
+[1, 2] |
+5 |
+
+
+| [[1, 1, 1], [1, 0, 1], [1, 1, 1]] |
+[1, 0] |
+[1, 2] |
+4 |
+
+
+| [[1, 1, 1, 1, 1]] |
+[0, 0] |
+[0, 4] |
+4 |
+
+
+| [[1]] |
+[0, 0] |
+[0, 0] |
+0 |
+
+
+
+
+
+입출력 예 설명
+
+입출력 예 #1
+
+문제 예시와 같습니다.
+
+입출력 예 #2
+
+주어진 조건을 그림으로 나타내면 아래와 같습니다.
+
+
+
+항상 이기는 플레이어는 B, 항상 지는 플레이어는 A입니다.
+
+다음은 B가 이기는 방법 중 하나입니다.
+
+
+- A가 (1, 0)에서 (0, 0)으로 이동
+- B가 (1, 2)에서 (2, 2)로 이동
+- A가 (0, 0)에서 (0, 1)로 이동
+- B가 (2, 2)에서 (2, 1)로 이동
+- A가 (0, 1)에서 (0, 2)로 이동
+- B가 (2, 1)에서 (2, 0)으로 이동
+- A는 더 이상 이동할 수 없어 패배합니다.
+
+
+위와 같이 플레이할 경우 이동 횟수 6번 만에 게임을 B의 승리로 끝낼 수 있습니다.
+
+B가 다음과 같이 플레이할 경우 게임을 더 빨리 끝낼 수 있습니다. 이길 수 있는 플레이어는 최대한 빨리 게임을 끝내려 하기 때문에 위 방법 대신 아래 방법을 선택합니다.
+
+
+- A가 (1, 0)에서 (0, 0)으로 이동
+- B가 (1, 2)에서 (0, 2)로 이동
+- A가 (0, 0)에서 (0, 1)로 이동
+- B가 (0, 2)에서 (0, 1)로 이동
+- A는 더 이상 이동할 수 없어 패배합니다.
+
+
+위와 같이 플레이할 경우 이동 횟수 4번 만에 게임을 B의 승리로 끝낼 수 있습니다. 따라서 4를 return 합니다.
+
+입출력 예 #3
+
+양 플레이어는 매 차례마다 한 가지 선택지밖에 고를 수 없습니다. 그 결과, (0, 2)에서 어디로도 이동할 수 없는 A가 패배합니다. 양 플레이어가 캐릭터를 움직인 횟수의 합은 4입니다.
+
+입출력 예 #4
+
+게임을 시작하는 플레이어 A가 처음부터 어디로도 이동할 수 없는 상태입니다. 따라서 A의 패배이며, 이동 횟수의 합은 0입니다.
+
+
+
+제한시간 안내
+
+
+
+
+> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
\ No newline at end of file
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220.js" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220.js"
new file mode 100644
index 0000000..1f78488
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220.js"
@@ -0,0 +1,50 @@
+const solution = (board, aloc, bloc) => {
+ const dir = [
+ [0, 1],
+ [0, -1],
+ [1, 0],
+ [-1, 0],
+ ];
+
+ const row = board.length;
+ const col = board[0].length;
+
+ const out = (y, x) => {
+ if (y < 0 || y >= row || x < 0 || x >= col || !board[y][x]) return false;
+ return true;
+ };
+
+ const dfs = ([ay, ax], [by, bx], turn, cnt) => {
+ if (!board[ay][ax] || !board[by][bx]) return { win: false, cnt: cnt };
+
+ let win_cnt = Infinity;
+ let lose_cnt = 0;
+
+ const [currentY, currentX] = turn === 0 ? [ay, ax] : [by, bx];
+
+ board[currentY][currentX] = 0;
+
+ for (let i = 0; i < 4; i++) {
+ const [y, x] = dir[i];
+ const [dy, dx] = [currentY + y, currentX + x];
+
+ if (!out(dy, dx)) continue;
+
+ const nextTurn =
+ turn === 0
+ ? dfs([dy, dx], [by, bx], 1 - turn, cnt + 1)
+ : dfs([ay, ax], [dy, dx], 1 - turn, cnt + 1);
+
+ if (nextTurn.win === false) win_cnt = Math.min(win_cnt, nextTurn.cnt);
+ else lose_cnt = Math.max(lose_cnt, nextTurn.cnt);
+ }
+
+ board[currentY][currentX] = 1;
+
+ if (win_cnt === Infinity && lose_cnt === 0) return { win: false, cnt };
+ if (win_cnt !== Infinity) return { win: true, cnt: win_cnt };
+ return { win: false, cnt: lose_cnt };
+ };
+
+ return dfs(aloc, bloc, 0, 0).cnt;
+};
\ No newline at end of file
From 03aa95f9ead44afb157ea79e11513052c231564b Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Fri, 7 Apr 2023 11:55:16 +0900
Subject: [PATCH 04/11] Update README.md
---
README.md | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/README.md b/README.md
index 6d849b4..382f212 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,9 @@
# 0-study-algorithms
+ 코드잇 FE 부트캠프 0기 알고리즘 스터디!
+
+## 프로세스
+ 1. 코드잇 organization에 있는 upstream repo의 main 브랜치에서 본인 브랜치를 생성한다(나는 henry라는 이름으로 활동 중이다).
+ 2. upstream repo를 fork 한 뒤, origin repo를 로컬에서 clone한다. (백준 허브를 사용하면 로컬 환경을 사용할 필요 없다)
+ 3. 어쨌든 origin main 브랜치에서 알고리즘 풀이들을 관리한다.
+ 4. upstream repo의 본인 브랜치에 PR(마감기한 : 일요일 자정)을 한다.
+
From d3b10a19fa7ebcb0304595b31eb1634e70f68d9f Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Fri, 7 Apr 2023 11:59:02 +0900
Subject: [PATCH 05/11] Update README.md
---
README.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 382f212..3479890 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,13 @@
# 0-study-algorithms
코드잇 FE 부트캠프 0기 알고리즘 스터디!
-## 프로세스
+## 가이드 라인
1. 코드잇 organization에 있는 upstream repo의 main 브랜치에서 본인 브랜치를 생성한다(나는 henry라는 이름으로 활동 중이다).
2. upstream repo를 fork 한 뒤, origin repo를 로컬에서 clone한다. (백준 허브를 사용하면 로컬 환경을 사용할 필요 없다)
3. 어쨌든 origin main 브랜치에서 알고리즘 풀이들을 관리한다.
4. upstream repo의 본인 브랜치에 PR(마감기한 : 일요일 자정)을 한다.
+## 스터디 방식
+
+ 1. 코드잇 정규 커리큘럼을 소화하기도 벅차며, 각자 알고리즘 실력의 편차가 다르므로 "기록"을 최우선 목표로 설정했다.
+ 2. 매주 본인이 정한 알고리즘 문제 개수만큼 풀고 공유한다.
From 8c023e0d5c23e366c95973628abf11e7f8593de0 Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Sat, 8 Apr 2023 15:58:29 +0900
Subject: [PATCH 06/11] =?UTF-8?q?[unrated]=20Title:=20=ED=91=9C=20?=
=?UTF-8?q?=EB=B3=91=ED=95=A9,=20Time:=2021.48=20ms,=20Memory:=2038=20MB?=
=?UTF-8?q?=20-BaekjoonHub?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md" | 287 ++++++++++++++++++
...34\342\200\205\353\263\221\355\225\251.js" | 70 +++++
2 files changed, 357 insertions(+)
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/unrated/150366.\342\200\205\355\221\234\342\200\205\353\263\221\355\225\251/README.md"
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/unrated/150366.\342\200\205\355\221\234\342\200\205\353\263\221\355\225\251/\355\221\234\342\200\205\353\263\221\355\225\251.js"
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/unrated/150366.\342\200\205\355\221\234\342\200\205\353\263\221\355\225\251/README.md" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/unrated/150366.\342\200\205\355\221\234\342\200\205\353\263\221\355\225\251/README.md"
new file mode 100644
index 0000000..e86dada
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/unrated/150366.\342\200\205\355\221\234\342\200\205\353\263\221\355\225\251/README.md"
@@ -0,0 +1,287 @@
+# [unrated] 표 병합 - 150366
+
+[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/150366?language=javascript)
+
+### 성능 요약
+
+메모리: 38 MB, 시간: 21.48 ms
+
+### 구분
+
+코딩테스트 연습 > 2023 KAKAO BLIND RECRUITMENT
+
+### 채점결과
+
+
정확성: 100.0
합계: 100.0 / 100.0
+
+### 문제 설명
+
+당신은 표 편집 프로그램을 작성하고 있습니다.
+표의 크기는 50 × 50으로 고정되어있고 초기에 모든 셀은 비어 있습니다.
+각 셀은 문자열 값을 가질 수 있고, 다른 셀과 병합될 수 있습니다.
+위에서 r번째, 왼쪽에서 c번째 위치를 (r, c)라고 표현할 때, 당신은 다음 명령어들에 대한 기능을 구현하려고 합니다.
+
+
+-
"UPDATE r c value"
+
+
+- (
r, c) 위치의 셀을 선택합니다.
+- 선택한 셀의 값을
value로 바꿉니다.
+
+-
"UPDATE value1 value2"
+
+
+value1을 값으로 가지고 있는 모든 셀을 선택합니다.
+- 선택한 셀의 값을
value2로 바꿉니다.
+
+-
"MERGE r1 c1 r2 c2"
+
+
+- (
r1, c1) 위치의 셀과 (r2, c2) 위치의 셀을 선택하여 병합합니다.
+- 선택한 두 위치의 셀이 같은 셀일 경우 무시합니다.
+- 선택한 두 셀은 서로 인접하지 않을 수도 있습니다. 이 경우 (
r1, c1) 위치의 셀과 (r2, c2) 위치의 셀만 영향을 받으며, 그 사이에 위치한 셀들은 영향을 받지 않습니다.
+- 두 셀 중 한 셀이 값을 가지고 있을 경우 병합된 셀은 그 값을 가지게 됩니다.
+- 두 셀 모두 값을 가지고 있을 경우 병합된 셀은 (
r1, c1) 위치의 셀 값을 가지게 됩니다.
+- 이후 (
r1, c1) 와 (r2, c2) 중 어느 위치를 선택하여도 병합된 셀로 접근합니다.
+
+-
"UNMERGE r c"
+
+
+- (
r, c) 위치의 셀을 선택하여 해당 셀의 모든 병합을 해제합니다.
+- 선택한 셀이 포함하고 있던 모든 셀은 프로그램 실행 초기의 상태로 돌아갑니다.
+- 병합을 해제하기 전 셀이 값을 가지고 있었을 경우 (
r, c) 위치의 셀이 그 값을 가지게 됩니다.
+
+-
"PRINT r c"
+
+
+- (
r, c) 위치의 셀을 선택하여 셀의 값을 출력합니다.
+- 선택한 셀이 비어있을 경우
"EMPTY"를 출력합니다.
+
+
+
+아래는 UPDATE 명령어를 실행하여 빈 셀에 값을 입력하는 예시입니다.
+
+
+| commands |
+효과 |
+
+
+
+| UPDATE 1 1 menu |
+(1,1)에 "menu" 입력 |
+
+
+| UPDATE 1 2 category |
+(1,2)에 "category" 입력 |
+
+
+| UPDATE 2 1 bibimbap |
+(2,1)에 "bibimbap" 입력 |
+
+
+| UPDATE 2 2 korean |
+(2,2)에 "korean" 입력 |
+
+
+| UPDATE 2 3 rice |
+(2,3)에 "rice" 입력 |
+
+
+| UPDATE 3 1 ramyeon |
+(3,1)에 "ramyeon" 입력 |
+
+
+| UPDATE 3 2 korean |
+(3,2)에 "korean" 입력 |
+
+
+| UPDATE 3 3 noodle |
+(3,3)에 "noodle" 입력 |
+
+
+| UPDATE 3 4 instant |
+(3,4)에 "instant" 입력 |
+
+
+| UPDATE 4 1 pasta |
+(4,1)에 "pasta" 입력 |
+
+
+| UPDATE 4 2 italian |
+(4,2)에 "italian" 입력 |
+
+
+| UPDATE 4 3 noodle |
+(4,3)에 "noodle" 입력 |
+
+
+
+위 명령어를 실행하면 아래 그림과 같은 상태가 됩니다.
+
+
+
+아래는 MERGE 명령어를 실행하여 셀을 병합하는 예시입니다.
+
+
+| commands |
+효과 |
+
+
+
+| MERGE 1 2 1 3 |
+(1,2)와 (1,3) 병합 |
+
+
+| MERGE 1 3 1 4 |
+(1,3)과 (1,4) 병합 |
+
+
+
+위 명령어를 실행하면 아래와 같은 상태가 됩니다.
+
+
+
+병합한 셀은 "category" 값을 가지게 되며 (1,2), (1,3), (1,4) 중 어느 위치를 선택하더라도 접근할 수 있습니다.
+
+아래는 UPDATE 명령어를 실행하여 셀의 값을 변경하는 예시입니다.
+
+
+| commands |
+효과 |
+
+
+
+| UPDATE korean hansik |
+"korean"을 "hansik"으로 변경 |
+
+
+| UPDATE 1 3 group |
+(1,3) 위치의 셀 값을 "group"으로 변경 |
+
+
+
+위 명령어를 실행하면 아래와 같은 상태가 됩니다.
+
+
+
+아래는 UNMERGE 명령어를 실행하여 셀의 병합을 해제하는 예시입니다.
+
+
+| commands |
+효과 |
+
+
+
+| UNMERGE 1 4 |
+셀 병합 해제 후 원래 값은 (1,4)가 가짐 |
+
+
+
+위 명령어를 실행하면 아래와 같은 상태가 됩니다.
+
+
+
+실행할 명령어들이 담긴 1차원 문자열 배열 commands가 매개변수로 주어집니다. commands의 명령어들을 순서대로 실행하였을 때, "PRINT r c" 명령어에 대한 실행결과를 순서대로 1차원 문자열 배열에 담아 return 하도록 solution 함수를 완성해주세요.
+
+
+
+제한사항
+
+
+- 1 ≤
commands의 길이 ≤ 1,000
+commands의 각 원소는 아래 5가지 형태 중 하나입니다.
+
+
+"UPDATE r c value"
+
+
+r, c는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
+value는 셀에 입력할 내용을 나타내며, 알파벳 소문자와 숫자로 구성된 길이 1~10 사이인 문자열입니다.
+
+"UPDATE value1 value2"
+
+
+value1은 선택할 셀의 값, value2는 셀에 입력할 내용을 나타내며, 알파벳 소문자와 숫자로 구성된 길이 1~10 사이인 문자열입니다.
+
+"MERGE r1 c1 r2 c2"
+
+
+r1, c1, r2, c2는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
+
+"UNMERGE r c"
+
+
+r, c는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
+
+"PRINT r c"
+
+
+r, c는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
+
+
+commands는 1개 이상의 "PRINT r c" 명령어를 포함하고 있습니다.
+
+
+
+
+입출력 예
+
+
+| commands |
+result |
+
+
+
+["UPDATE 1 1 menu", "UPDATE 1 2 category", "UPDATE 2 1 bibimbap", "UPDATE 2 2 korean", "UPDATE 2 3 rice", "UPDATE 3 1 ramyeon", "UPDATE 3 2 korean", "UPDATE 3 3 noodle", "UPDATE 3 4 instant", "UPDATE 4 1 pasta", "UPDATE 4 2 italian", "UPDATE 4 3 noodle", "MERGE 1 2 1 3", "MERGE 1 3 1 4", "UPDATE korean hansik", "UPDATE 1 3 group", "UNMERGE 1 4", "PRINT 1 3", "PRINT 1 4"] |
+["EMPTY", "group"] |
+
+
+["UPDATE 1 1 a", "UPDATE 1 2 b", "UPDATE 2 1 c", "UPDATE 2 2 d", "MERGE 1 1 1 2", "MERGE 2 2 2 1", "MERGE 2 1 1 1", "PRINT 1 1", "UNMERGE 2 2", "PRINT 1 1"] |
+["d", "EMPTY"] |
+
+
+
+
+
+입출력 예 설명
+
+입출력 예 #1
+
+
+- 문제 예시와 같습니다. (1,3) 위치의 셀은 비어있고 (1,4) 위치의 셀 값은
"group"입니다. 따라서 ["EMPTY", "group"]을 return 해야 합니다.
+
+
+입출력 예 #2
+
+
+- 모든
UPDATE 명령어를 실행하면 아래와 같은 상태가 됩니다.
+
+
+
+
+
+"MERGE 1 1 1 2" 명령어를 실행하면 아래와 같은 상태가 됩니다.
+
+
+
+
+
+"MERGE 2 2 2 1" 명령어를 실행하면 아래와 같은 상태가 됩니다.
+
+
+
+
+
+"MERGE 2 1 1 1" 명령어를 실행하면 아래와 같은 상태가 됩니다.
+
+
+
+
+
+"UNMERGE 2 2" 명령어를 실행하면 아래와 같은 상태가 됩니다.
+
+
+
+
+
+> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
\ No newline at end of file
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/unrated/150366.\342\200\205\355\221\234\342\200\205\353\263\221\355\225\251/\355\221\234\342\200\205\353\263\221\355\225\251.js" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/unrated/150366.\342\200\205\355\221\234\342\200\205\353\263\221\355\225\251/\355\221\234\342\200\205\353\263\221\355\225\251.js"
new file mode 100644
index 0000000..cff3f9e
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/unrated/150366.\342\200\205\355\221\234\342\200\205\353\263\221\355\225\251/\355\221\234\342\200\205\353\263\221\355\225\251.js"
@@ -0,0 +1,70 @@
+class Table {
+ count = 0;
+ _table = new Array(50)
+ .fill(0)
+ .map(() => new Array(50).fill(0).map(() => ({})));
+
+ getCell(r, c) {
+ return this._table[r - 1][c - 1];
+ }
+ setCell(r, c, value) {
+ this._table[r - 1][c - 1] = value;
+ }
+ update(...params) {
+ if (params[2] != null) {
+ const [r, c, value] = params;
+ const cell = this.getCell(r, c);
+ cell.value = value;
+ } else {
+ const [value1, value2] = params;
+
+ this._table.forEach((row) => {
+ row.forEach((cell) => {
+ if (cell && cell.value === value1) cell.value = value2;
+ });
+ });
+ }
+ }
+
+ replaceCell(cell1, cell2) {
+ this._table = this._table.map((row) =>
+ row.map((cell) => (cell === cell1 ? cell2 : cell))
+ );
+ }
+
+ merge(r1, c1, r2, c2) {
+ const cell1 = this.getCell(r1, c1);
+ const cell2 = this.getCell(r2, c2);
+
+ if (cell1.value == null) {
+ this.replaceCell(cell1, cell2);
+ } else {
+ this.replaceCell(cell2, cell1);
+ }
+ }
+
+ unmerge(r, c) {
+ const cell = this.getCell(r, c);
+
+ this._table = this._table.map((row) => {
+ return row.map((c) => (c == cell ? {} : c));
+ });
+ this.setCell(r, c, cell);
+ }
+
+ print(r, c) {
+ return this.getCell(r, c).value || "EMPTY";
+ }
+}
+
+function solution(commands) {
+ const table = new Table();
+ const answer = [];
+
+ commands.forEach((line) => {
+ const [command, ...params] = line.split(" ");
+ const result = table[command.toLowerCase()](...params);
+ if (result) answer.push(result);
+ });
+ return answer;
+}
\ No newline at end of file
From aac66094c66cb04f2988f20d79b10b8b1178a6fa Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Sat, 8 Apr 2023 18:50:11 +0900
Subject: [PATCH 07/11] =?UTF-8?q?Delete=20=ED=94=84=EB=A1=9C=EA=B7=B8?=
=?UTF-8?q?=EB=9E=98=EB=A8=B8=EC=8A=A4/lv0/120803.=E2=80=85=EB=91=90?=
=?UTF-8?q?=E2=80=85=EC=88=98=EC=9D=98=E2=80=85=EC=B0=A8=20directory?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md" | 69 -------------------
...30\354\235\230\342\200\205\354\260\250.js" | 3 -
2 files changed, 72 deletions(-)
delete mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md"
delete mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js"
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md"
deleted file mode 100644
index e67a378..0000000
--- "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md"
+++ /dev/null
@@ -1,69 +0,0 @@
-# [level 0] 두 수의 차 - 120803
-
-[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/120803)
-
-### 성능 요약
-
-메모리: 33.4 MB, 시간: 0.03 ms
-
-### 구분
-
-코딩테스트 연습 > 코딩테스트 입문
-
-### 채점결과
-
-
정확성: 100.0
합계: 100.0 / 100.0
-
-### 문제 설명
-
-정수 num1과 num2가 주어질 때, num1에서 num2를 뺀 값을 return하도록 soltuion 함수를 완성해주세요.
-
-
-
-제한사항
-
-
-- -50000 ≤
num1 ≤ 50000
-- -50000 ≤
num2 ≤ 50000
-
-
-
-
-입출력 예
-
-
-| num1 |
-num2 |
-result |
-
-
-
-| 2 |
-3 |
--1 |
-
-
-| 100 |
-2 |
-98 |
-
-
-
-
-
-입출력 예 설명
-
-입출력 예 #1
-
-
-num1이 2이고 num2가 3이므로 2 - 3 = -1을 return합니다.
-
-
-입출력 예 #2
-
-
-num1이 100이고 num2가 2이므로 100 - 2 = 98을 return합니다.
-
-
-
-> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
\ No newline at end of file
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js"
deleted file mode 100644
index 2dff566..0000000
--- "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js"
+++ /dev/null
@@ -1,3 +0,0 @@
-function solution(num1, num2) {
- return num1 - num2
-}
\ No newline at end of file
From f46c983d40219cffdebffdcccbcbd711203ce020 Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Wed, 5 Apr 2023 14:03:00 +0900
Subject: [PATCH 08/11] =?UTF-8?q?[level=200]=20Title:=20=EB=91=90=20?=
=?UTF-8?q?=EC=88=98=EC=9D=98=20=EC=B0=A8,=20Time:=200.03=20ms,=20Memory:?=
=?UTF-8?q?=2033.4=20MB=20-BaekjoonHub?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md" | 69 +++++++++++++++++++
...30\354\235\230\342\200\205\354\260\250.js" | 3 +
2 files changed, 72 insertions(+)
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md"
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js"
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md"
new file mode 100644
index 0000000..e67a378
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/README.md"
@@ -0,0 +1,69 @@
+# [level 0] 두 수의 차 - 120803
+
+[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/120803)
+
+### 성능 요약
+
+메모리: 33.4 MB, 시간: 0.03 ms
+
+### 구분
+
+코딩테스트 연습 > 코딩테스트 입문
+
+### 채점결과
+
+
정확성: 100.0
합계: 100.0 / 100.0
+
+### 문제 설명
+
+정수 num1과 num2가 주어질 때, num1에서 num2를 뺀 값을 return하도록 soltuion 함수를 완성해주세요.
+
+
+
+제한사항
+
+
+- -50000 ≤
num1 ≤ 50000
+- -50000 ≤
num2 ≤ 50000
+
+
+
+
+입출력 예
+
+
+| num1 |
+num2 |
+result |
+
+
+
+| 2 |
+3 |
+-1 |
+
+
+| 100 |
+2 |
+98 |
+
+
+
+
+
+입출력 예 설명
+
+입출력 예 #1
+
+
+num1이 2이고 num2가 3이므로 2 - 3 = -1을 return합니다.
+
+
+입출력 예 #2
+
+
+num1이 100이고 num2가 2이므로 100 - 2 = 98을 return합니다.
+
+
+
+> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
\ No newline at end of file
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js"
new file mode 100644
index 0000000..2dff566
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv0/120803.\342\200\205\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250/\353\221\220\342\200\205\354\210\230\354\235\230\342\200\205\354\260\250.js"
@@ -0,0 +1,3 @@
+function solution(num1, num2) {
+ return num1 - num2
+}
\ No newline at end of file
From 5a3bda27a173cead8e4c3f1b148349614e3357da Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Wed, 5 Apr 2023 22:11:16 +0900
Subject: [PATCH 09/11] =?UTF-8?q?[level=203]=20Title:=20=EC=B9=B4=EB=93=9C?=
=?UTF-8?q?=20=EC=A7=9D=20=EB=A7=9E=EC=B6=94=EA=B8=B0,=20Time:=207.70=20ms?=
=?UTF-8?q?,=20Memory:=2038.7=20MB=20-BaekjoonHub?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md" | 133 ++++++++++++++++++
...05\353\247\236\354\266\224\352\270\260.js" | 85 +++++++++++
2 files changed, 218 insertions(+)
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/README.md"
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260.js"
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/README.md" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/README.md"
new file mode 100644
index 0000000..86e88fa
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/README.md"
@@ -0,0 +1,133 @@
+# [level 3] 카드 짝 맞추기 - 72415
+
+[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/72415)
+
+### 성능 요약
+
+메모리: 38.7 MB, 시간: 7.70 ms
+
+### 구분
+
+코딩테스트 연습 > 2021 KAKAO BLIND RECRUITMENT
+
+### 채점결과
+
+
정확성: 100.0
합계: 100.0 / 100.0
+
+### 문제 설명
+
+게임 개발자인 베로니는 개발 연습을 위해 다음과 같은 간단한 카드 짝맞추기 보드 게임을 개발해 보려고 합니다.
+게임이 시작되면 화면에는 카드 16장이 뒷면을 위로하여 4 x 4 크기의 격자 형태로 표시되어 있습니다. 각 카드의 앞면에는 카카오프렌즈 캐릭터 그림이 그려져 있으며, 8가지의 캐릭터 그림이 그려진 카드가 각기 2장씩 화면에 무작위로 배치되어 있습니다.
+유저가 카드를 2장 선택하여 앞면으로 뒤집었을 때 같은 그림이 그려진 카드면 해당 카드는 게임 화면에서 사라지며, 같은 그림이 아니라면 원래 상태로 뒷면이 보이도록 뒤집힙니다. 이와 같은 방법으로 모든 카드를 화면에서 사라지게 하면 게임이 종료됩니다.
+
+게임에서 카드를 선택하는 방법은 다음과 같습니다.
+
+
+- 카드는
커서를 이용해서 선택할 수 있습니다.
+
+
+- 커서는 4 x 4 화면에서 유저가 선택한 현재 위치를 표시하는 "굵고 빨간 테두리 상자"를 의미합니다.
+
+- 커서는 [Ctrl] 키와 방향키에 의해 이동되며 키 조작법은 다음과 같습니다.
+
+
+- 방향키 ←, ↑, ↓, → 중 하나를 누르면, 커서가 누른 키 방향으로 1칸 이동합니다.
+- [Ctrl] 키를 누른 상태에서 방향키 ←, ↑, ↓, → 중 하나를 누르면, 누른 키 방향에 있는 가장 가까운 카드로 한번에 이동합니다.
+
+
+- 만약, 해당 방향에 카드가 하나도 없다면 그 방향의 가장 마지막 칸으로 이동합니다.
+
+- 만약, 누른 키 방향으로 이동 가능한 카드 또는 빈 공간이 없어 이동할 수 없다면 커서는 움직이지 않습니다.
+
+- 커서가 위치한 카드를 뒤집기 위해서는 [Enter] 키를 입력합니다.
+
+
+- [Enter] 키를 입력해서 카드를 뒤집었을 때
+
+
+- 앞면이 보이는 카드가 1장 뿐이라면 그림을 맞출 수 없으므로 두번째 카드를 뒤집을 때 까지 앞면을 유지합니다.
+- 앞면이 보이는 카드가 2장이 된 경우, 두개의 카드에 그려진 그림이 같으면 해당 카드들이 화면에서 사라지며, 그림이 다르다면 두 카드 모두 뒷면이 보이도록 다시 뒤집힙니다.
+
+
+
+
+"베로니"는 게임 진행 중 카드의 짝을 맞춰 몇 장 제거된 상태에서 카드 앞면의 그림을 알고 있다면, 남은 카드를 모두 제거하는데 필요한 키 조작 횟수의 최솟값을 구해 보려고 합니다. 키 조작 횟수는 방향키와 [Enter] 키를 누르는 동작을 각각 조작 횟수 1로 계산하며, [Ctrl] 키와 방향키를 함께 누르는 동작 또한 조작 횟수 1로 계산합니다.
+
+다음은 카드가 몇 장 제거된 상태의 게임 화면에서 커서를 이동하는 예시입니다.
+아래 그림에서 빈 칸은 이미 카드가 제거되어 없어진 칸을 의미하며, 그림이 그려진 칸은 카드 앞 면에 그려진 그림을 나타냅니다.
+
+
+예시에서 커서는 두번째 행, 첫번째 열 위치에서 시작하였습니다.
+
+[Enter] 입력, ↓ 이동, [Ctrl]+→ 이동, [Enter] 입력 = 키 조작 4회
+
+[Ctrl]+↑ 이동, [Enter] 입력, [Ctrl]+← 이동, [Ctrl]+↓ 이동, [Enter] 입력 = 키 조작 5회
+
+[Ctrl]+→ 이동, [Enter] 입력, [Ctrl]+↑ 이동, [Ctrl]+← 이동, [Enter] 입력 = 키 조작 5회
+
+위와 같은 방법으로 커서를 이동하여 카드를 선택하고 그림을 맞추어 카드를 모두 제거하기 위해서는 총 14번(방향 이동 8번, [Enter] 키 입력 6번)의 키 조작 횟수가 필요합니다.
+
+
+
+[문제]
+
+현재 카드가 놓인 상태를 나타내는 2차원 배열 board와 커서의 처음 위치 r, c가 매개변수로 주어질 때, 모든 카드를 제거하기 위한 키 조작 횟수의 최솟값을 return 하도록 solution 함수를 완성해 주세요.
+
+[제한사항]
+
+
+- board는 4 x 4 크기의 2차원 배열입니다.
+- board 배열의 각 원소는 0 이상 6 이하인 자연수입니다.
+
+
+- 0은 카드가 제거된 빈 칸을 나타냅니다.
+- 1 부터 6까지의 자연수는 2개씩 들어있으며 같은 숫자는 같은 그림의 카드를 의미합니다.
+- 뒤집을 카드가 없는 경우(board의 모든 원소가 0인 경우)는 입력으로 주어지지 않습니다.
+
+- r은 커서의 최초 세로(행) 위치를 의미합니다.
+- c는 커서의 최초 가로(열) 위치를 의미합니다.
+- r과 c는 0 이상 3 이하인 정수입니다.
+- 게임 화면의 좌측 상단이 (0, 0), 우측 하단이 (3, 3) 입니다.
+
+
+
+
+[입출력 예]
+
+
+| board |
+r |
+c |
+result |
+
+
+
+| [[1,0,0,3],[2,0,0,0],[0,0,0,2],[3,0,1,0]] |
+1 |
+0 |
+14 |
+
+
+| [[3,0,0,2],[0,0,1,0],[0,1,0,0],[2,0,0,3]] |
+0 |
+1 |
+16 |
+
+
+
+입출력 예에 대한 설명
+
+
+
+입출력 예 #1
+문제의 예시와 같습니다.
+
+입출력 예 #2
+입력으로 주어진 게임 화면은 아래 그림과 같습니다.
+
+
+
+위 게임 화면에서 모든 카드를 제거하기 위한 키 조작 횟수의 최솟값은 16번 입니다.
+
+
+> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
\ No newline at end of file
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260.js" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260.js"
new file mode 100644
index 0000000..e42d86c
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/72415.\342\200\205\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260/\354\271\264\353\223\234\342\200\205\354\247\235\342\200\205\353\247\236\354\266\224\352\270\260.js"
@@ -0,0 +1,85 @@
+const solution = (board, r, c) => {
+ // 출처 : https://www.youtube.com/watch?v=Q4bTSdi1psw&t=2s
+ const bfs = (visited, src, dst) => {
+ const out = (x, y) => x < 0 || x > 3 || y < 0 || y > 3;
+
+ const dir = [
+ [-1, 0],
+ [1, 0],
+ [0, -1],
+ [0, 1],
+ ];
+
+ const graph = Array.from({ length: 4 }, () => Array(4).fill(false));
+ const queue = [[...src, 0]];
+
+ while (queue.length) {
+ const [y, x, cnt] = queue.shift();
+ if (y === dst[0] && x === dst[1]) {
+ return cnt;
+ }
+ for (const [dy, dx] of dir) {
+ let [ny, nx] = [y + dy, x + dx];
+
+ if (out(ny, nx)) continue;
+
+ if (!graph[ny][nx]) {
+ graph[ny][nx] = true;
+ queue.push([ny, nx, cnt + 1]);
+ }
+
+ for (let i = 0; i < 2; i++) {
+ if (!(visited & (1 << board[ny][nx]))) break;
+ if (out(ny + dy, nx + dx)) break;
+
+ [ny, nx] = [ny + dy, nx + dx];
+ }
+ if (!graph[ny][nx]) {
+ graph[ny][nx] = true;
+ queue.push([ny, nx, cnt + 1]);
+ }
+ }
+ }
+
+ return Infinity;
+ };
+
+ const permutate = (cnt, visited, src) => {
+ if (visited === allVisited) {
+ answer = Math.min(answer, cnt);
+ return;
+ }
+ for (const [card, pos] of card_pos.entries()) {
+ if (visited & (1 << card)) continue;
+
+ const first =
+ bfs(visited, src, pos[0]) + bfs(visited, pos[0], pos[1]) + 2;
+ const second =
+ bfs(visited, src, pos[1]) + bfs(visited, pos[1], pos[0]) + 2;
+
+ permutate(cnt + first, visited | (1 << card), pos[1]);
+ permutate(cnt + second, visited | (1 << card), pos[0]);
+ }
+ };
+
+ const card_pos = new Map();
+
+ let allVisited = 1;
+ let answer = Infinity;
+
+ board.forEach((row, y) => {
+ row.forEach((card, x) => {
+ if (!card) return;
+
+ if (card_pos.has(card)) {
+ card_pos.get(card).push([y, x]);
+ return;
+ }
+ card_pos.set(card, [[y, x]]);
+ allVisited |= 1 << card;
+ });
+ });
+
+ permutate(0, 1, [r, c]);
+ return answer;
+};
\ No newline at end of file
From 50c49f63b90ce0ef1d1b8c175f47f2e8b30bea9e Mon Sep 17 00:00:00 2001
From: "Yong-Woo, Lee" <110705019+wooleejaan@users.noreply.github.com>
Date: Thu, 6 Apr 2023 09:43:02 +0900
Subject: [PATCH 10/11] =?UTF-8?q?[level=203]=20Title:=20=EC=82=AC=EB=9D=BC?=
=?UTF-8?q?=EC=A7=80=EB=8A=94=20=EB=B0=9C=ED=8C=90,=20Time:=200.24=20ms,?=
=?UTF-8?q?=20Memory:=2033.4=20MB=20-BaekjoonHub?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md" | 175 ++++++++++++++++++
...24\342\200\205\353\260\234\355\214\220.js" | 50 +++++
2 files changed, 225 insertions(+)
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/README.md"
create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220.js"
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/README.md" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/README.md"
new file mode 100644
index 0000000..fac6952
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/README.md"
@@ -0,0 +1,175 @@
+# [level 3] 사라지는 발판 - 92345
+
+[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/92345)
+
+### 성능 요약
+
+메모리: 33.4 MB, 시간: 0.24 ms
+
+### 구분
+
+코딩테스트 연습 > 2022 KAKAO BLIND RECRUITMENT
+
+### 채점결과
+
+
정확성: 100.0
합계: 100.0 / 100.0
+
+### 문제 설명
+
+문제 설명
+
+플레이어 A와 플레이어 B가 서로 게임을 합니다. 당신은 이 게임이 끝날 때까지 양 플레이어가 캐릭터를 몇 번 움직이게 될지 예측하려고 합니다.
+
+각 플레이어는 자신의 캐릭터 하나를 보드 위에 올려놓고 게임을 시작합니다. 게임 보드는 1x1 크기 정사각 격자로 이루어져 있으며, 보드 안에는 발판이 있는 부분과 없는 부분이 있습니다. 발판이 있는 곳에만 캐릭터가 서있을 수 있으며, 처음 캐릭터를 올려놓는 곳은 항상 발판이 있는 곳입니다. 캐릭터는 발판이 있는 곳으로만 이동할 수 있으며, 보드 밖으로 이동할 수 없습니다. 밟고 있던 발판은 그 위에 있던 캐릭터가 다른 곳으로 이동하여 다른 발판을 밞음과 동시에 사라집니다. 양 플레이어는 번갈아가며 자기 차례에 자신의 캐릭터를 상하좌우로 인접한 4개의 칸 중에서 발판이 있는 칸으로 옮겨야 합니다.
+
+다음과 같은 2가지 상황에서 패자와 승자가 정해지며, 게임이 종료됩니다.
+
+
+- 움직일 차례인데 캐릭터의 상하좌우 주변 4칸이 모두 발판이 없거나 보드 밖이라서 이동할 수 없는 경우, 해당 차례 플레이어는 패배합니다.
+- 두 캐릭터가 같은 발판 위에 있을 때, 상대 플레이어의 캐릭터가 다른 발판으로 이동하여 자신의 캐릭터가 서있던 발판이 사라지게 되면 패배합니다.
+
+
+게임은 항상 플레이어 A가 먼저 시작합니다. 양 플레이어는 최적의 플레이를 합니다. 즉, 이길 수 있는 플레이어는 최대한 빨리 승리하도록 플레이하고, 질 수밖에 없는 플레이어는 최대한 오래 버티도록 플레이합니다. '이길 수 있는 플레이어'는 실수만 하지 않는다면 항상 이기는 플레이어를 의미하며, '질 수밖에 없는 플레이어'는 최선을 다해도 상대가 실수하지 않으면 항상 질 수밖에 없는 플레이어를 의미합니다. 최대한 오래 버틴다는 것은 양 플레이어가 캐릭터를 움직이는 횟수를 최대화한다는 것을 의미합니다.
+
+아래 그림은 초기 보드의 상태와 각 플레이어의 위치를 나타내는 예시입니다.
+
+
+
+위와 같은 경우, 플레이어 A는 실수만 하지 않는다면 항상 이길 수 있습니다. 따라서 플레이어 A는 이길 수 있는 플레이어이며, B는 질 수밖에 없는 플레이어입니다. 다음은 A와 B가 최적의 플레이를 하는 과정을 나타냅니다.
+
+
+- 플레이어 A가 초기 위치 (1, 0)에서 (1, 1)로 이동합니다. 플레이어 A가 (0, 0)이나 (2, 0)으로 이동할 경우 승리를 보장할 수 없습니다. 따라서 무조건 이길 방법이 있는 (1, 1)로 이동합니다.
+- 플레이어 B는 (1, 1)로 이동할 경우, 바로 다음 차례에 A가 위 또는 아래 방향으로 이동하면 발판이 없어져 패배하게 됩니다. 질 수밖에 없는 플레이어는 최대한 오래 버티도록 플레이하기 때문에 (1, 1)로 이동하지 않습니다. (1, 2)에서 위쪽 칸인 (0, 2)로 이동합니다.
+- A가 (1, 1)에서 (0, 1)로 이동합니다.
+- B에게는 남은 선택지가 (0, 1)밖에 없습니다. 따라서 (0, 2)에서 (0, 1)로 이동합니다.
+- A가 (0, 1)에서 (0, 0)으로 이동합니다. 이동을 완료함과 동시에 B가 서있던 (0, 1)의 발판이 사라집니다. B가 패배합니다.
+- 만약 과정 2에서 B가 아래쪽 칸인 (2, 2)로 이동하더라도 A는 (2, 1)로 이동하면 됩니다. 이후 B가 (2, 1)로 이동, 다음 차례에 A가 (2, 0)으로 이동하면 B가 패배합니다.
+
+
+위 예시에서 양 플레이어가 최적의 플레이를 했을 경우, 캐릭터의 이동 횟수 합은 5입니다. 최적의 플레이를 하는 방법은 여러 가지일 수 있으나, 이동한 횟수는 모두 5로 같습니다.
+
+게임 보드의 초기 상태를 나타내는 2차원 정수 배열 board와 플레이어 A의 캐릭터 초기 위치를 나타내는 정수 배열 aloc, 플레이어 B의 캐릭터 초기 위치를 나타내는 정수 배열 bloc이 매개변수로 주어집니다. 양 플레이어가 최적의 플레이를 했을 때, 두 캐릭터가 움직인 횟수의 합을 return 하도록 solution 함수를 완성해주세요.
+
+
+
+제한사항
+
+
+- 1 ≤
board의 세로 길이 ≤ 5
+- 1 ≤
board의 가로 길이 ≤ 5
+board의 원소는 0 또는 1입니다.
+
+
+- 0은 발판이 없음을, 1은 발판이 있음을 나타냅니다.
+- 게임 보드의 좌측 상단 좌표는 (0, 0), 우측 하단 좌표는 (
board의 세로 길이 - 1, board의 가로 길이 - 1)입니다.
+
+aloc과 bloc은 각각 플레이어 A의 캐릭터와 플레이어 B의 캐릭터 초기 위치를 나타내는 좌표값이며 [r, c] 형태입니다.
+
+
+- r은 몇 번째 행인지를 나타냅니다.
+- 0 ≤ r <
board의 세로 길이
+- c는 몇 번째 열인지를 나타냅니다.
+- 0 ≤ c <
board의 가로 길이
+- 초기 보드의
aloc과 bloc 위치는 항상 발판이 있는 곳입니다.
+aloc과 bloc이 같을 수 있습니다.
+
+- 상대 플레이어의 캐릭터가 있는 칸으로 이동할 수 있습니다.
+
+
+
+
+입출력 예
+
+
+| board |
+aloc |
+bloc |
+result |
+
+
+
+| [[1, 1, 1], [1, 1, 1], [1, 1, 1]] |
+[1, 0] |
+[1, 2] |
+5 |
+
+
+| [[1, 1, 1], [1, 0, 1], [1, 1, 1]] |
+[1, 0] |
+[1, 2] |
+4 |
+
+
+| [[1, 1, 1, 1, 1]] |
+[0, 0] |
+[0, 4] |
+4 |
+
+
+| [[1]] |
+[0, 0] |
+[0, 0] |
+0 |
+
+
+
+
+
+입출력 예 설명
+
+입출력 예 #1
+
+문제 예시와 같습니다.
+
+입출력 예 #2
+
+주어진 조건을 그림으로 나타내면 아래와 같습니다.
+
+
+
+항상 이기는 플레이어는 B, 항상 지는 플레이어는 A입니다.
+
+다음은 B가 이기는 방법 중 하나입니다.
+
+
+- A가 (1, 0)에서 (0, 0)으로 이동
+- B가 (1, 2)에서 (2, 2)로 이동
+- A가 (0, 0)에서 (0, 1)로 이동
+- B가 (2, 2)에서 (2, 1)로 이동
+- A가 (0, 1)에서 (0, 2)로 이동
+- B가 (2, 1)에서 (2, 0)으로 이동
+- A는 더 이상 이동할 수 없어 패배합니다.
+
+
+위와 같이 플레이할 경우 이동 횟수 6번 만에 게임을 B의 승리로 끝낼 수 있습니다.
+
+B가 다음과 같이 플레이할 경우 게임을 더 빨리 끝낼 수 있습니다. 이길 수 있는 플레이어는 최대한 빨리 게임을 끝내려 하기 때문에 위 방법 대신 아래 방법을 선택합니다.
+
+
+- A가 (1, 0)에서 (0, 0)으로 이동
+- B가 (1, 2)에서 (0, 2)로 이동
+- A가 (0, 0)에서 (0, 1)로 이동
+- B가 (0, 2)에서 (0, 1)로 이동
+- A는 더 이상 이동할 수 없어 패배합니다.
+
+
+위와 같이 플레이할 경우 이동 횟수 4번 만에 게임을 B의 승리로 끝낼 수 있습니다. 따라서 4를 return 합니다.
+
+입출력 예 #3
+
+양 플레이어는 매 차례마다 한 가지 선택지밖에 고를 수 없습니다. 그 결과, (0, 2)에서 어디로도 이동할 수 없는 A가 패배합니다. 양 플레이어가 캐릭터를 움직인 횟수의 합은 4입니다.
+
+입출력 예 #4
+
+게임을 시작하는 플레이어 A가 처음부터 어디로도 이동할 수 없는 상태입니다. 따라서 A의 패배이며, 이동 횟수의 합은 0입니다.
+
+
+
+제한시간 안내
+
+
+
+
+> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
\ No newline at end of file
diff --git "a/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220.js" "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220.js"
new file mode 100644
index 0000000..1f78488
--- /dev/null
+++ "b/\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244/lv3/92345.\342\200\205\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220/\354\202\254\353\235\274\354\247\200\353\212\224\342\200\205\353\260\234\355\214\220.js"
@@ -0,0 +1,50 @@
+const solution = (board, aloc, bloc) => {
+ const dir = [
+ [0, 1],
+ [0, -1],
+ [1, 0],
+ [-1, 0],
+ ];
+
+ const row = board.length;
+ const col = board[0].length;
+
+ const out = (y, x) => {
+ if (y < 0 || y >= row || x < 0 || x >= col || !board[y][x]) return false;
+ return true;
+ };
+
+ const dfs = ([ay, ax], [by, bx], turn, cnt) => {
+ if (!board[ay][ax] || !board[by][bx]) return { win: false, cnt: cnt };
+
+ let win_cnt = Infinity;
+ let lose_cnt = 0;
+
+ const [currentY, currentX] = turn === 0 ? [ay, ax] : [by, bx];
+
+ board[currentY][currentX] = 0;
+
+ for (let i = 0; i < 4; i++) {
+ const [y, x] = dir[i];
+ const [dy, dx] = [currentY + y, currentX + x];
+
+ if (!out(dy, dx)) continue;
+
+ const nextTurn =
+ turn === 0
+ ? dfs([dy, dx], [by, bx], 1 - turn, cnt + 1)
+ : dfs([ay, ax], [dy, dx], 1 - turn, cnt + 1);
+
+ if (nextTurn.win === false) win_cnt = Math.min(win_cnt, nextTurn.cnt);
+ else lose_cnt = Math.max(lose_cnt, nextTurn.cnt);
+ }
+
+ board[currentY][currentX] = 1;
+
+ if (win_cnt === Infinity && lose_cnt === 0) return { win: false, cnt };
+ if (win_cnt !== Infinity) return { win: true, cnt: win_cnt };
+ return { win: false, cnt: lose_cnt };
+ };
+
+ return dfs(aloc, bloc, 0, 0).cnt;
+};
\ No newline at end of file
From e2034c5eeefd8357664d6a89fb274831ebbc54b9 Mon Sep 17 00:00:00 2001
From: wooleejaan
Date: Sun, 9 Apr 2023 12:47:51 +0900
Subject: [PATCH 11/11] Update README.md
---
README.md | 49 ++++++-------------------------------------------
1 file changed, 6 insertions(+), 43 deletions(-)
diff --git a/README.md b/README.md
index 949ca0b..f7f07c5 100644
--- a/README.md
+++ b/README.md
@@ -1,47 +1,10 @@
# 0-study-algorithms
-💜 코드잇 프론트엔드 부트캠프 0기 알고리즘 스터디입니다.💜
-## 가이드라인
-사전 준비물 : 백준 허브
-모든 문제는 백준 허브를 사용해서 올리는 것을 전제로 합니다😉
-
+코드잇 FE 부트캠프 0기 알고리즘 스터디!
-👇 아래 사진처럼 설정하세요!😆
-
-
-
-
-1. upstream repo의 main에서 본인 이름(ex. eva) 브랜치를 생성한다.
-2. fork를 한후 fork된 origin 레포를 clone한다.
-4. 로컬에서 main브랜치에서 작업 후 origin 레포의 main에 push한다.
- - `git push origin main`
-5. upstream repo의 본인 이름 브랜치에 pr을 날린다~
-
-
-## ✅ commit 규칙
-- commit 메세지: [문제 출처(플랫폼)] 문제이름 / 난이도 / 걸린시간
-- description: 문제 주소 (option)
-- 터미널에서 작성법:
-```
-git commit -m "[BOJ] Hello World / 브론즈5 / 1분" -m "https://www.acmicpc.net/problem/2557"
-```
-- 플랫폼 작성법 통일:
- * [BOJ] - 백준
- * [PGS] - 프로그래머스
- * [FSC] - 패스트캠퍼스
- * [LTC] - 리트코드
- * [CFS] - 코드포스
- * [SEA] - 삼성SW Expert Academy
- * [ETC] - 그외
-
-
-
-## ✅ PR 규칙
- 일요일 자정까지 pr 날리기!
-
-- PR 제목: 이름 / n월 n주차 / 몇 문제
-- ```eva / 5월 1주차 / 4문제 ```
-
-- comment는 자유이나 가능하다면, 이번주에 풀었던 문제의 알고리즘 분류가 어떻게 되는지,
어떤 문제가 어려웠는지 회고를 작성한다면 개인에게도 도움되고 다른 코드 리뷰어가 참고하기 좋을 것 같습니다 :)
-- 백준 허브를 사용하면 commit을 할 필요 없으므로 위에서 명시한 commit 메시지를 PR에 포함해서 작성하면 좋을 것 같습니다!
+## 프로세스
+1. 코드잇 organization에 있는 upstream repo의 main 브랜치에서 본인 브랜치를 생성한다(나는 henry라는 이름으로 활동 중이다).
+2. upstream repo를 fork 한 뒤, origin repo를 로컬에서 clone한다. (백준 허브를 사용하면 로컬 환경을 사용할 필요 없다)
+3. 어쨌든 origin main 브랜치에서 알고리즘 풀이들을 관리한다.
+4. upstream repo의 본인 브랜치에 PR(마감기한 : 일요일 자정)을 한다.