diff --git "a/hyunjung/week16/\353\202\230\353\254\264\354\236\220\353\245\264\352\270\260.js" "b/hyunjung/week16/\353\202\230\353\254\264\354\236\220\353\245\264\352\270\260.js" new file mode 100644 index 0000000..d6a1260 --- /dev/null +++ "b/hyunjung/week16/\353\202\230\353\254\264\354\236\220\353\245\264\352\270\260.js" @@ -0,0 +1,34 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") + +const [n, m] = input[0].split(" ").map(Number) +const arr = input[1].split(" ").map(Number) + +function solution(n, m, trees) { + arr.sort((a, b) => a - b) + let height = 0 + start = 0 + end = Math.max(...trees) + + for (let i = 0; i < n; i++) { + while (start <= end) { + let mid = Math.floor((start + end) / 2) + let woodSum = 0 + trees.forEach((tree) => { + let wood = tree - mid + if (wood > 0) woodSum += wood + }) + if (woodSum >= m) { + if (mid > height) height = mid + start = mid + 1 + } else { + end = mid - 1 + } + } + } + return height +} +//제출 +const answer = solution(n, m, arr) +console.log(answer) diff --git "a/hyunjung/week16/\354\230\210\354\202\260.js" "b/hyunjung/week16/\354\230\210\354\202\260.js" new file mode 100644 index 0000000..a66361b --- /dev/null +++ "b/hyunjung/week16/\354\230\210\354\202\260.js" @@ -0,0 +1,31 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") + +let [n, arr, budget] = [+input[0], input[1].split(" ").map(Number), +input[2]] + +const solution = (n, arr, budget) => { + arr = arr.sort((a, b) => a - b) + + let start = 0 + let end = arr.at(-1) + + while (start <= end) { + let mid = parseInt((start + end) / 2) + let sum = 0 + for (let i = 0; i < n; i++) { + if (arr[i] > mid) { + //요청금액 > 상한액 + sum += mid //상한액 더하기 + } else { + //요청금액 < 상한액 + sum += arr[i] //요청금액 더하기 + } + } + sum <= budget ? (start = mid + 1) : (end = mid - 1) //총액이 예산보다 작으면 최소금액 증가, 크면 최소금액 감소 + } + return end +} + +const answer = solution(n, arr, budget) +console.log(answer) diff --git "a/hyunjung/week16/\354\232\251\353\217\210\352\264\200\353\246\254.js" "b/hyunjung/week16/\354\232\251\353\217\210\352\264\200\353\246\254.js" new file mode 100644 index 0000000..7684762 --- /dev/null +++ "b/hyunjung/week16/\354\232\251\353\217\210\352\264\200\353\246\254.js" @@ -0,0 +1,54 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") + +let [n, m] = input[0].split(" ") +const arr = input.slice(1).map(Number) + +n = +n +m = +m + +const solution = (days, withdrawal, A) => { + let start = Math.min(...A) + let end = A.reduce((a, c) => a + c, 0) + let K = Infinity + + while (start <= end) { + let min = 0 + let mid = Math.floor((start + end) / 2) + let sum = mid + let cnt = 0 + + for (let i = 0; i < days; i++) { + if (sum - A[i] >= 0) { + sum -= A[i] + } else { + cnt++ + sum = mid - A[i] + if (sum < 0) { + min = A[i] + break + } + } + } + if (min > 0) { + start = min + continue + } + + if (sum < mid) cnt++ + if (cnt <= withdrawal) { + if (K > mid) { + K = mid + } + end = mid - 1 + } else { + start = mid + 1 + } + } + return K +} + +// 제출 +const answer = solution(n, m, arr) +console.log(answer) diff --git a/hyunjung/week17/DOM.js b/hyunjung/week17/DOM.js new file mode 100644 index 0000000..e0a6637 --- /dev/null +++ b/hyunjung/week17/DOM.js @@ -0,0 +1,42 @@ +//시간 초과 +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +const [n, m, p] = input[0].split(" ").map(Number) +const channels = input.slice(1).map((el) => el.split(" ").map(Number)) + +const solution = (n, m, p, channels) => { + let curChannel = p + let cnt = 0 + let searched = new Array(m + 1).fill(false) + + const changeChannel = (channels, curChannel) => { + if (searched[curChannel]) { + return (cnt = -1) + } + searched[curChannel] = true + + for (let i = 0; i < channels.length; i++) { + if (channels[i][1] === curChannel) { + //현재 채널이 싫어하는 채널이면 + curChannel = channels[i][0] //좋아하는 채널로 변경 + + if (searched[curChannel]) { + // 변경한 채널이 검색한 채널이면 리턴 + return (cnt = -1) + } else { + cnt++ + return changeChannel(channels, curChannel) + } + } + } + } + + changeChannel(channels, curChannel) + + return cnt +} + +//제출 +const answer = solution(n, m, p, channels) +console.log(answer) diff --git a/hyunjung/week17/DOM_2.js b/hyunjung/week17/DOM_2.js new file mode 100644 index 0000000..974d04d --- /dev/null +++ b/hyunjung/week17/DOM_2.js @@ -0,0 +1,37 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +const [n, m, p] = input[0].split(" ").map(Number) +const channels = input.slice(1).map((el) => el.split(" ").map(Number)) + +const solution = (n, m, first, channels) => { + let A = [] + let cnt = 0 + + let visited = [...Array(m + 1)].fill(false) + for (let i = 1; i <= m; i++) { + A[i] = [] + } + + for (let i = 0; i < n; i++) { + let [like, hate] = channels[i] + if (A[hate].length === 0) A[hate] = like + } + + const DFS = (node) => { + if (visited[node]) return -1 + visited[node] = true + for (let i = 1; i <= m; i++) { + if (A[node] === i) { + cnt++ + return DFS(i) + } + } + } + + if (DFS(first) === -1) return -1 + return cnt +} + +const answer = solution(n, m, p, channels) +console.log(answer) diff --git "a/hyunjung/week17/\352\262\275\353\241\234\354\260\276\352\270\260.js" "b/hyunjung/week17/\352\262\275\353\241\234\354\260\276\352\270\260.js" new file mode 100644 index 0000000..aac04e7 --- /dev/null +++ "b/hyunjung/week17/\352\262\275\353\241\234\354\260\276\352\270\260.js" @@ -0,0 +1,29 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +let n = input[0] +n = +n +const graph = input.slice(1).map((el) => el.split(" ").map(Number)) + +const solution = (n, graph) => { + const result = [...Array(n)].map(() => Array(n).fill(0)) // 답을 저장할 2차원 배열 + + const DFS = (edge, line, visited) => { + for (let i = 0; i < n; i++) { + if (graph[edge][i] && !visited[i]) { + visited[i] = true + result[line][i] = 1 + DFS(i, line, visited) //line은 계속 고정 + } + } + } + + for (let i = 0; i < n; i++) { + const visited = new Array(n).fill(false) + DFS(i, i, visited) + } + return result.map((v) => v.join(" ")).join("\n") +} + +const answer = solution(n, graph) +console.log(answer) diff --git "a/hyunjung/week17/\354\225\210\354\240\204\354\230\201\354\227\255.js" "b/hyunjung/week17/\354\225\210\354\240\204\354\230\201\354\227\255.js" new file mode 100644 index 0000000..c356275 --- /dev/null +++ "b/hyunjung/week17/\354\225\210\354\240\204\354\230\201\354\227\255.js" @@ -0,0 +1,48 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +let n = input[0] +n = +n +const map = input.slice(1).map((el) => el.split(" ").map(Number)) + +const solution = (n, area) => { + let max = 0 + + const DFS = (row, col, h, visited) => { + let dx = [0, 1, 0, -1] + let dy = [1, 0, -1, 0] + + for (let i = 0; i < 4; i++) { + let ax = row + dx[i], + ay = col + dy[i] + if (ax >= 0 && ay >= 0 && ax < n && ay < n) { + if (!visited[ax][ay]) { + visited[ax][ay] = true + DFS(ax, ay, h, visited) + } + } + } + } + + for (let h = 0; h <= 100; h++) { + let cnt = 0 + const visited = [...Array(n)].map((_, x) => + [...Array(n)].map((_, y) => area[x][y] <= h) + ) + for (let row = 0; row < n; row++) { + for (let col = 0; col < n; col++) { + if (!visited[row][col]) { + visited[row][col] = true + DFS(row, col, h, visited) + cnt++ + } + } + } + max = Math.max(max, cnt) + } + + return max +} + +const answer = solution(n, map) +console.log(answer) diff --git "a/hyunjung/week17/\354\227\260\352\262\260\354\232\224\354\206\214\354\235\230\352\260\234\354\210\230.js" "b/hyunjung/week17/\354\227\260\352\262\260\354\232\224\354\206\214\354\235\230\352\260\234\354\210\230.js" new file mode 100644 index 0000000..8672140 --- /dev/null +++ "b/hyunjung/week17/\354\227\260\352\262\260\354\232\224\354\206\214\354\235\230\352\260\234\354\210\230.js" @@ -0,0 +1,46 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +const [n, m] = input[0].split(" ").map(Number) + +const solution = (n, m, input) => { + let A = [] + let cnt = 0 + let visited = new Array(n + 1).fill(false) + + for (let i = 1; i < n + 1; i++) { + A[i] = [] + } + + //A 인접 리스트에 그래프 데이터 저장하기 + for (let i = 0; i < m; i++) { + let [from, to] = input[i + 1].split(" ").map(Number) + A[from].push(to) + A[to].push(from) + } + + const DFS = (start) => { + if (visited[start]) return + visited[start] = true //방문처리 + + for (let i = 0; i < A[start].length; i++) { + const next = A[start][i] + if (!visited[next]) { + DFS(next) //방문하지 않은 노드만 탐색 + } + } + } + + for (let i = 1; i <= n; i++) { + if (!visited[i]) { + DFS(i) //방문하지 않은 노드가 있으면 dfs실행 + cnt++ //연결 요소 개수++ + } + } + + return cnt +} + +//제출 +const answer = solution(n, m, input) +console.log(answer) diff --git "a/hyunjung/week17/\354\234\240\352\270\260\353\206\215\353\260\260\354\266\224.js" "b/hyunjung/week17/\354\234\240\352\270\260\353\206\215\353\260\260\354\266\224.js" new file mode 100644 index 0000000..37f6983 --- /dev/null +++ "b/hyunjung/week17/\354\234\240\352\270\260\353\206\215\353\260\260\354\266\224.js" @@ -0,0 +1,71 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" + +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +let n = input[0] +n = +n +let line = 1 +let meta = [] +let map = [] + +for (let i = 0; i < n; i++) { + let [M, N, K] = input[line].split(" ").map(Number) + let bug = input.slice(line + 1, line + 1 + K).map((el) => el.split(" ")) + meta.push([M, N, K]) + map.push(bug) + line += K + 1 +} + +const solution = (test, meta, map) => { + let result = [] + + for (let T = 0; T < test; T++) { + let [M, N, cabbages] = meta[T] + let bug = 0 + + //방문 목록 + const visited = [...Array(N)].map(() => Array(M).fill(0)) + + const A = [...Array(N)].map(() => Array(M).fill(0)) + + //그래프 데이터 저장하기 + for (let i = 0; i < cabbages; i++) { + let [row, col] = map[T][i].map((v) => +v) + A[col][row] = 1 + } + + const DFS = (row, col) => { + let dx = [0, 1, 0, -1] + let dy = [1, 0, -1, 0] + + visited[row][col] = 1 + + for (let i = 0; i < 4; i++) { + //현재 노드의 4면 조사 + let ax = row + dx[i], + ay = col + dy[i] + if (ax >= 0 && ay >= 0 && ax < N && ay < M) { + //범위를 벗어나지 않으면 + if (visited[ax][ay] === 0 && A[ax][ay] === 1) { + DFS(ax, ay) + } + } + } + } + + // 배추 위치 전체 탐색 + for (let row = 0; row < N; row++) { + for (let col = 0; col < M; col++) { + if (visited[row][col] === 0 && A[row][col] === 1) { + DFS(row, col) + bug++ + } + } + } + result.push(bug) + } + return result.join("\n") +} +//제출 +const answer = solution(n, meta, map) +console.log(answer) diff --git "a/hyunjung/week18/DFS\354\231\200BFS.js" "b/hyunjung/week18/DFS\354\231\200BFS.js" new file mode 100644 index 0000000..a1aeec0 --- /dev/null +++ "b/hyunjung/week18/DFS\354\231\200BFS.js" @@ -0,0 +1,82 @@ +// 런타임 에러 (TypeError) +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +const [n, m, v] = input[0].split(" ").map(Number) +const graph = input.slice(1).map((el) => el.split(" ").map(Number)) + +const solution = (n, m, v, graph) => { + // n: 노드 개수, m: 에지 개수, v: 시작점 + + let result = [] + + //그래프를 저장할 인접 리스트 + let A = [] + //인접 리스트 초기화 + for (let i = 1; i <= n; i++) { + A[i] = [] + } + //인접 리스트에 그래프 저장하기(m 개수만큼) + for (let i = 0; i < m; i++) { + let [start, end] = graph[i] + A[start].push(end) + A[end].push(start) + } + + //오름차순 정렬 + for (let i = 1; i <= m; i++) { + A[i].sort((a, b) => a - b) + } + + //방문 배열 초기화 + let visited = new Array(m + 1).fill(false) + let curResult = [] + + const DFS = (node) => { + if (visited[node]) return + //방문 노드를 배열에 추가 + curResult.push(node) + visited[node] = true + + for (let i = 0; i < A[node].length; i++) { + let next = A[node][i] + if (!visited[next]) { + DFS(next) + } + } + } + + DFS(v) + result.push(curResult) + + //visited 초기화 + visited = new Array(m + 1).fill(false) + curResult = [] + + const BFS = (node) => { + let Q = [] + Q.push(node) + visited[node] = true + + while (Q.length > 0) { + cur_node = Q.shift() + curResult.push(cur_node) + + for (let i = 0; i < A[cur_node].length; i++) { + let next = A[cur_node][i] + if (!visited[next]) { + visited[next] = true + Q.push(next) + } + } + } + } + BFS(v) + result.push(curResult) + + return result.map((v) => v.join(" ")).join("\n") +} + +//제출 +const answer = solution(n, m, v, graph) +console.log(answer) diff --git "a/hyunjung/week18/\353\257\270\353\241\234\355\203\220\354\203\211.js" "b/hyunjung/week18/\353\257\270\353\241\234\355\203\220\354\203\211.js" new file mode 100644 index 0000000..9821358 --- /dev/null +++ "b/hyunjung/week18/\353\257\270\353\241\234\355\203\220\354\203\211.js" @@ -0,0 +1,56 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") + +let [n, m] = input[0].split(" ") +n = +n +m = +m + +const map = input + .slice(1) + .map((el) => el.split("").map(Number)) + .map((el) => el) + +const solution = (n, m, map) => { + const dx = [0, 1, 0, -1] + const dy = [1, 0, -1, 0] + + const A = [...Array(map.length)].map(() => Array(map[0].length).fill(0)) + + for (let i = 0; i < map.length; i++) { + for (let j = 0; j < map[i].length; j++) { + A[i][j] = map[i][j] + } + } + + const visited = [...Array(map.length)].map(() => + Array(map[0].length).fill(false) + ) + + const BFS = (startX, startY) => { + const queue = [[startX, startY]] + visited[startX][startY] = 1 + + while (queue.length) { + const now = queue.shift() + + for (let i = 0; i < 4; i++) { + let nx = now[0] + dx[i] + let ny = now[1] + dy[i] + if (nx >= 0 && ny >= 0 && nx < map.length && ny < map[0].length) { + if (A[nx][ny] !== 0 && !visited[nx][ny]) { + visited[nx][ny] = true + A[nx][ny] = A[now[0]][now[1]] + 1 + queue.push([nx, ny]) + } + } + } + } + } + + BFS(0, 0) + return A[n - 1][m - 1] +} + +const answer = solution(n, m, map) +console.log(answer) diff --git "a/hyunjung/week18/\354\234\240\352\270\260\353\206\215\353\260\260\354\266\224.js" "b/hyunjung/week18/\354\234\240\352\270\260\353\206\215\353\260\260\354\266\224.js" new file mode 100644 index 0000000..d2860f2 --- /dev/null +++ "b/hyunjung/week18/\354\234\240\352\270\260\353\206\215\353\260\260\354\266\224.js" @@ -0,0 +1,76 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +let n = input[0] +n = +n +let line = 1 +let meta = [] +let map = [] + +for (let i = 0; i < n; i++) { + let [M, N, K] = input[line].split(" ").map(Number) + let bug = input.slice(line + 1, line + 1 + K).map((el) => el.split(" ")) + meta.push([M, N, K]) + map.push(bug) + line += K + 1 +} + +const solution = (test, meta, map) => { + let result = [] + + for (let T = 0; T < test; T++) { + let [M, N, cabbages] = meta[T] + let bug = 0 + + const visited = [...Array(N)].map(() => Array(M).fill(0)) + const A = [...Array(N)].map(() => Array(M).fill(0)) + + for (let i = 0; i < cabbages; i++) { + let [row, col] = map[T][i].map((v) => +v) + A[col][row] = 1 + } + const BFS = (startX, startY) => { + const queue = [[startX, startY]] + visited[startX][startY] = 1 + let dx = [0, 1, 0, -1] + let dy = [1, 0, -1, 0] + + while (queue.length > 0) { + for (let i = 0; i < queue.length; i++) { + const [x, y] = queue.shift() + if (A[x][y] === 0) continue + A[x][y] = 0 + + for (let j = 0; j < 4; j++) { + let nx = x + dx[j] + let ny = y + dy[j] + if ( + nx >= 0 && + ny >= 0 && + nx < N && + ny < M && + A[nx][ny] === 1 && + !visited[nx][ny] + ) { + queue.push([nx, ny]) + } + } + } + } + } + + for (let row = 0; row < N; row++) { + for (let col = 0; col < M; col++) { + if (visited[row][col] === 0 && A[row][col] === 1) { + BFS(row, col) + bug++ + } + } + } + result.push(bug) + } + return result.join("\n") +} + +const answer = solution(n, meta, map) +console.log(answer) diff --git "a/hyunjung/week18/\354\264\214\354\210\230\352\263\204\354\202\260.js" "b/hyunjung/week18/\354\264\214\354\210\230\352\263\204\354\202\260.js" new file mode 100644 index 0000000..d53e722 --- /dev/null +++ "b/hyunjung/week18/\354\264\214\354\210\230\352\263\204\354\202\260.js" @@ -0,0 +1,53 @@ +const fs = require("fs") +// const readFileSyncAddress = "/dev/stdin"; +const readFileSyncAddress = "예제.txt" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") + +let people = input[0] + +let [n, m] = input[1].split(" ") +const arr = input.slice(3).map((el) => el.split(" ").map(Number)) +people = +people +n = +n +m = +m + +const solution = (people, start, target, arr) => { + const graph = Array.from({length: people + 1}).map(() => []) + const visited = Array.from({length: people + 1}).map(() => false) + + for (let i = 0; i < arr.length; i++) { + const [x, y] = arr[i] + graph[x].push(y) + graph[y].push(x) + } + + //graph : [[], [2, 3], [1, 7, 8, 9], [1], [5, 6], [4], [4], [2], [2], [2]] + + const BFS = (start) => { + const queue = [[start, 0]] + + while (queue.length) { + let [person, cnt] = queue.shift() + let nearRelation = graph[person] //1촌 + if (!visited[person]) { + if (person === target) return cnt + visited[person] = true + } + + //1촌 순회 + for (let i = 0; i < nearRelation.length; i++) { + let person = nearRelation[i] + if (visited[person]) continue + if (person === target) return cnt + 1 + queue.push([person, cnt + 1]) + } + } + return -1 + } + + return BFS(start) +} + +// 제출 +const answer = solution(people, n, m, arr) +console.log(answer) diff --git "a/hyunjung/week19/01\355\203\200\354\235\274.js" "b/hyunjung/week19/01\355\203\200\354\235\274.js" new file mode 100644 index 0000000..2e00671 --- /dev/null +++ "b/hyunjung/week19/01\355\203\200\354\235\274.js" @@ -0,0 +1,22 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +const [N] = input.map(Number) + +function solution(N) { + const DP = new Array(1000001).fill(-1) + + DP[0] = 0 + DP[1] = 1 + DP[2] = 2 + + for (let i = 3; i <= N; i++) { + DP[i] = (DP[i - 1] + DP[i - 2]) % 15746 + DP[i] %= 15746 //시간 280ms -> 196ms + } + // console.log(DP) //[0, 1, 2, 3, 5,..] + return DP[N] +} +//제출 +const answer = solution(N) +console.log(answer) diff --git "a/hyunjung/week19/1\353\241\234\353\247\214\353\223\244\352\270\260.js" "b/hyunjung/week19/1\353\241\234\353\247\214\353\223\244\352\270\260.js" new file mode 100644 index 0000000..306472c --- /dev/null +++ "b/hyunjung/week19/1\353\241\234\353\247\214\353\223\244\352\270\260.js" @@ -0,0 +1,23 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" + +const input = fs + .readFileSync(readFileSyncAddress) + .toString() + .trim() + .split("\n") + .map(Number) + +const solution = (n) => { + let A = new Array(n + 1).fill(0) + + for (let i = 2; i <= n; i++) { + A[i] = A[i - 1] + 1 + if (i % 2 === 0) A[i] = Math.min(A[i], A[i / 2] + 1) + if (i % 3 === 0) A[i] = Math.min(A[i], A[i / 3] + 1) + } + return A[n] +} + +const answer = solution(input[0]) +console.log(answer) diff --git "a/hyunjung/week19/2xn\355\203\200\354\235\274\353\247\201.js" "b/hyunjung/week19/2xn\355\203\200\354\235\274\353\247\201.js" new file mode 100644 index 0000000..c1f00e3 --- /dev/null +++ "b/hyunjung/week19/2xn\355\203\200\354\235\274\353\247\201.js" @@ -0,0 +1,20 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs.readFileSync(readFileSyncAddress).toString().trim().split("\n") +const [N] = input.map(Number) + +function solution(N) { + const DP = new Array(1001).fill(-1) + + DP[1] = 1 + DP[2] = 2 + + for (let i = 3; i <= N; i++) { + DP[i] = (DP[i - 1] + DP[i - 2]) % 10007 + DP[i] %= 10007 + } + return DP[N] +} + +const answer = solution(N) +console.log(answer) diff --git "a/hyunjung/week19/\353\217\214\352\262\214\354\236\204.js" "b/hyunjung/week19/\353\217\214\352\262\214\354\236\204.js" new file mode 100644 index 0000000..74fd350 --- /dev/null +++ "b/hyunjung/week19/\353\217\214\352\262\214\354\236\204.js" @@ -0,0 +1,15 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs + .readFileSync(readFileSyncAddress) + .toString() + .trim() + .split("\n") + .map(Number) + +const solution = (stone) => { + return stone % 2 === 0 ? "CY" : "SK" +} + +const answer = solution(input) +console.log(answer) diff --git "a/hyunjung/week19/\354\235\264\354\271\234\354\210\230.js" "b/hyunjung/week19/\354\235\264\354\271\234\354\210\230.js" new file mode 100644 index 0000000..8476e54 --- /dev/null +++ "b/hyunjung/week19/\354\235\264\354\271\234\354\210\230.js" @@ -0,0 +1,21 @@ +const fs = require("fs") +const readFileSyncAddress = "/dev/stdin" +const input = fs + .readFileSync(readFileSyncAddress) + .toString() + .trim() + .split("\n") + .map(Number) + +const solution = (n) => { + const A = new Array(n + 1).fill(BigInt(0)) + A[1] = BigInt(1) + + for (let i = 2; i <= n; i++) { + A[i] = A[i - 1] + A[i - 2] + } + return A[n].toString() +} + +const answer = solution(input[0]) +console.log(answer) diff --git "a/hyunjung/week20/\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251.js" "b/hyunjung/week20/\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251.js" new file mode 100644 index 0000000..2c12837 --- /dev/null +++ "b/hyunjung/week20/\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251.js" @@ -0,0 +1,28 @@ +const input = require("fs") + .readFileSync("/dev/stdin") + .toString() + .trim() + .split("\n") + +const [n, s] = input[0].split(" ").map(Number) +const array = input[1].split(" ").map(Number) + +function solution(n, s, array) { + let count = 0 + + const recursive = (i, sum) => { + if (i === n) return + + sum += array[i] + if (sum === s) count++ + + recursive(i + 1, sum) + recursive(i + 1, sum - array[i]) + } + + recursive(0, 0) + return count +} + +const answer = solution(n, s, array) +console.log(answer) diff --git "a/hyunjung/week20/\354\202\254\355\203\225\352\262\214\354\236\204.js" "b/hyunjung/week20/\354\202\254\355\203\225\352\262\214\354\236\204.js" new file mode 100644 index 0000000..111eda0 --- /dev/null +++ "b/hyunjung/week20/\354\202\254\355\203\225\352\262\214\354\236\204.js" @@ -0,0 +1,87 @@ +const input = require("fs") + .readFileSync("/dev/stdin") + .toString() + .trim() + .split("\n") + +let [n, ...candies] = input +n = +n +candies = candies.map((el) => el.split("")) + +function solution(n, candyMap) { + let maxCandies = 1 + const visited = [...Array(n)].map(() => Array(n).fill(false)) + + const dx = [0, 0, 1, -1] + const dy = [1, -1, 0, 0] + + const getMaxCandies = () => { + let count = 0 + let res = 0 + let pre = "" + for (let i = 0; i < n; i++) { + //행 검사 + count = 1 + pre = candyMap[0][i] + for (let j = 1; j < n; j++) { + if (pre === candyMap[j][i]) { + count++ + } else { + res = Math.max(res, count) + pre = candyMap[j][i] + count = 1 + } + } + res = Math.max(res, count) + + // 열 검사 + count = 1 + pre = candyMap[i][0] + for (let j = 1; j < n; j++) { + if (pre === candyMap[i][j]) { + count++ + } else { + res = Math.max(res, count) + pre = candyMap[i][j] + count = 1 + } + } + res = Math.max(res, count) + } + return res + } + + const searchMap = (x, y) => { + for (let i = 0; i < 4; i++) { + let ax = x + dx[i] + let ay = y + dy[i] + let temp + + if (ax >= 0 && ay >= 0 && ax < n && ay < n) { + if (!visited[ax][ay]) { + temp = candyMap[x][y] + candyMap[x][y] = candyMap[ax][ay] + candyMap[ax][ay] = temp + + maxCandies = Math.max(maxCandies, getMaxCandies()) + + temp = candyMap[x][y] + candyMap[x][y] = candyMap[ax][ay] + candyMap[ax][ay] = temp + } + + visited[x][y] = true + } + } + } + + for (let i = 0; i < n; i++) { + for (let j = 0; j < n; j++) { + searchMap(i, j) + } + } + return maxCandies +} + +const answer = solution(n, candies) +console.log(answer) diff --git "a/hyunjung/week20/\354\210\253\354\236\220\354\225\274\352\265\254.js" "b/hyunjung/week20/\354\210\253\354\236\220\354\225\274\352\265\254.js" new file mode 100644 index 0000000..481949f --- /dev/null +++ "b/hyunjung/week20/\354\210\253\354\236\220\354\225\274\352\265\254.js" @@ -0,0 +1,60 @@ +const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') + +let [n, ...games] = input +n = +n +games = games.map((el) => el.split(' ').map(Number)) + +function solution(n, games) { + let result = 0 + + for (let i = 123; i < 988; i++) { + let hundreds = parseInt(i / 100) //100의 자리 + let tens = parseInt((i / 10) % 10) //10의 자리 + let units = i % 10 + + // 중복 제거 + if (hundreds === tens || hundreds === units || tens === units) continue + + // 0 제거 : 102 120 ... + if (tens === 0 || units === 0) continue + + let check = true + + for (let i = 0; i < n; i++) { + let strike = 0, + ball = 0 + + let answer = games[i][0] // 생각한 숫자 + let strikeAnswer = games[i][1] + let ballAnswer = games[i][2] + + let hundredsOfAnswer = parseInt(answer / 100) + let tensOfAnswer = parseInt((answer / 10) % 10) + let unitsOfAnswer = answer % 10 + + //정확하게 일치하는 경우 + if (hundreds === hundredsOfAnswer) strike++ + if (tens === tensOfAnswer) strike++ + if (units === unitsOfAnswer) strike++ + + // 숫자 일치 && 자리 일치 X + if (hundredsOfAnswer === tens || hundredsOfAnswer === units) ball++ + if (tensOfAnswer === hundreds || tensOfAnswer === units) ball++ + if (unitsOfAnswer === hundreds || unitsOfAnswer === tens) ball++ + + if (ball !== ballAnswer || strike !== strikeAnswer) { + // ball이나 strike 개수가 다른 경우 counting 되지 않음 + check = false + break + } + } + + if (check) { + result++ + } + } + return result +} + +const answer = solution(n, games) +console.log(answer) diff --git "a/hyunjung/week20/\354\227\260\354\206\215\355\225\251.js" "b/hyunjung/week20/\354\227\260\354\206\215\355\225\251.js" new file mode 100644 index 0000000..8552ddc --- /dev/null +++ "b/hyunjung/week20/\354\227\260\354\206\215\355\225\251.js" @@ -0,0 +1,25 @@ +const input = require("fs") + .readFileSync("/dev/stdin") + .toString() + .trim() + .split("\n") + +const n = Number(input[0]) +const array = input[1].split(" ").map(Number) + +function solution(n, arr) { + let maxSum = [] + + for (let i = 0; i < n; i++) { + maxSum[i] = arr[i] + + if (maxSum[i] < maxSum[i - 1] + arr[i]) { + maxSum[i] = maxSum[i - 1] + arr[i] + } + } + + return Math.max(...maxSum) +} + +const answer = solution(n, array) +console.log(answer) diff --git "a/hyunjung/week20/\354\247\204\354\232\260\354\235\230\353\213\254\354\227\254\355\226\211.js" "b/hyunjung/week20/\354\247\204\354\232\260\354\235\230\353\213\254\354\227\254\355\226\211.js" new file mode 100644 index 0000000..689c386 --- /dev/null +++ "b/hyunjung/week20/\354\247\204\354\232\260\354\235\230\353\213\254\354\227\254\355\226\211.js" @@ -0,0 +1,45 @@ +const input = require("fs") + .readFileSync("/dev/stdin") + .toString() + .trim() + .split("\n") +const [n, m] = input[0].split(" ").map(Number) +const map = input.slice(1).map((el) => el.split(" ").map(Number)) + +const solution = (n, m, map) => { + let min = 600 + let visited + + const dy = [-1, 0, 1] + + const dfs = (depth, y, preD) => { + if (depth === n) { + let sum = map[0][visited[0]] + + for (let i = 1; i < n; i++) { + sum += map[i][visited[i]] + } + min = min > sum ? sum : min + return + } + + for (let i = 0; i < 3; i++) { + let ay = dy[i] + y + + if (ay >= 0 && ay < m && i !== preD) { + visited[depth] = ay + dfs(depth + 1, ay, i) + } + } + } + + for (let i = 0; i < m; i++) { + visited = new Array(n) + visited[0] = i + dfs(1, i, -1) + } + + return min +} +const answer = solution(n, m, map) +console.log(answer) diff --git a/hyunjung/week21/ListOfUniqueNumbers.js b/hyunjung/week21/ListOfUniqueNumbers.js new file mode 100644 index 0000000..56bec32 --- /dev/null +++ b/hyunjung/week21/ListOfUniqueNumbers.js @@ -0,0 +1,26 @@ +// 시간 초과 +const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') + +const n = Number(input[0]) +const arr = input[1].split(' ').map(Number) + +function solution(n, arr) { + let count = 0 + let left = 0 + let right = 0 + + while (left < n) { + if (arr[left] === arr[right + 1] || right === n - 1) { + left++ + right = left + count++ + continue + } + right++ + count++ + } + return count +} + +const answer = solution(n, arr) +console.log(answer) diff --git a/hyunjung/week21/ListofUniqueNumber_2.js b/hyunjung/week21/ListofUniqueNumber_2.js new file mode 100644 index 0000000..b9fa7bb --- /dev/null +++ b/hyunjung/week21/ListofUniqueNumber_2.js @@ -0,0 +1,26 @@ +const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') + +const n = Number(input[0]) +const arr = input[1].split(' ').map(Number) + +function solution(n, arr) { + let count = 0, + L = 0, + R = 0 + let visited = new Array(n + 1).fill(0) + + for (L; L < n; L++) { + while (R < n) { + if (visited[arr[R]]) break + visited[arr[R]] = 1 + R++ + } + count += R - L + visited[arr[L]] = 0 + } + + return count +} + +const answer = solution(n, arr) +console.log(answer) diff --git "a/hyunjung/week21/\353\266\200\353\266\204\355\225\251.js" "b/hyunjung/week21/\353\266\200\353\266\204\355\225\251.js" new file mode 100644 index 0000000..0773021 --- /dev/null +++ "b/hyunjung/week21/\353\266\200\353\266\204\355\225\251.js" @@ -0,0 +1,26 @@ +const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') + +const [n, s] = input[0].split(' ').map(Number) +const arr = input[1].split(' ').map(Number) + +function solution(n, s, arr) { + let max = 987654321 + let min_length = max + let L = 0, + R = 0, + sum = 0 + + for (L; L < n; L++) { + while (sum < s && R < n) { + sum += arr[R++] + } + + if (sum >= s) { + min_length = Math.min(min_length, R - L) + } + sum -= arr[L] + } + return min_length === max ? 0 : min_length +} +const answer = solution(n, s, arr) +console.log(answer) diff --git "a/hyunjung/week21/\354\242\213\353\213\244.js" "b/hyunjung/week21/\354\242\213\353\213\244.js" new file mode 100644 index 0000000..feb14f9 --- /dev/null +++ "b/hyunjung/week21/\354\242\213\353\213\244.js" @@ -0,0 +1,35 @@ +const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n') + +const n = Number(input[0]) +const arr = input[1].split(' ').map(Number) + +function solution(n, arr) { + let good = 0 + + arr.sort((a, b) => a - b) + + for (let i = 0; i < n; i++) { + let left = 0 + let right = n - 1 + while (left < right) { + if (arr[left] + arr[right] === arr[i]) { + if (left !== i && right !== i) { + good++ + break + } else if (left === i) { + left++ + } else if (right === i) { + right-- + } + } else if (arr[left] + arr[right] > arr[i]) { + right-- + } else { + left++ + } + } + } + return good +} + +const answer = solution(n, arr) +console.log(answer)