From 4ab0ba6d70bdb7344b162eb92e24de44a7246908 Mon Sep 17 00:00:00 2001 From: minjongbaek Date: 2022年6月30日 17:21:12 +0900 Subject: [PATCH 1/6] =?UTF-8?q?Create=20=EB=B0=A9=EA=B8=88-=EA=B7=B8?= =?UTF-8?q?=EA=B3=A1.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1352円270円210円-352円267円270円352円263円241円.js" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 "level-2/353円260円251円352円270円210円-352円267円270円352円263円241円.js" diff --git "a/level-2/353円260円251円352円270円210円-352円267円270円352円263円241円.js" "b/level-2/353円260円251円352円270円210円-352円267円270円352円263円241円.js" new file mode 100644 index 0000000..340a08c --- /dev/null +++ "b/level-2/353円260円251円352円270円210円-352円267円270円352円263円241円.js" @@ -0,0 +1,27 @@ +function convertString(m) { + return m + .replace(/C#/g, 'c') + .replace(/D#/g, 'd') + .replace(/F#/g, 'f') + .replace(/G#/g, 'g') + .replace(/A#/g, 'a'); +} + +function solution(m, musicinfos) { + const listenSound = convertString(m); + + const map = new Map(); + for (const info of musicinfos) { + const [start, finish, title, _score] = info.split(','); + const duration = ((+finish.slice(0, 2) * 60) + (+finish.slice(3, 5))) - ((+start.slice(0, 2) * 60) + (+start.slice(3, 5))); + + const score = convertString(_score); + const playScore = score.repeat(Math.ceil(duration / score.length)).slice(0, duration); + if (playScore.includes(listenSound)) { + map.set(title, {score, playScore}); + } + } + + const filter = [...map.keys()].sort((a,b) => map.get(b).playScore.length - map.get(a).playScore.length); + return filter.length>= 1 ? filter[0] : '(None)'; +} \ No newline at end of file From f254aa548e9c072b811f1d424292659e035d9ec0 Mon Sep 17 00:00:00 2001 From: minjongbaek Date: 2022年6月30日 17:21:19 +0900 Subject: [PATCH 2/6] =?UTF-8?q?Create=20=EB=B9=9B=EC=9D=98-=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C-=EC=82=AC=EC=9D=B4=ED=81=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4-354円202円254円354円235円264円355円201円264円.js" | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 "level-2/353円271円233円354円235円230円-352円262円275円353円241円234円-354円202円254円354円235円264円355円201円264円.js" diff --git "a/level-2/353円271円233円354円235円230円-352円262円275円353円241円234円-354円202円254円354円235円264円355円201円264円.js" "b/level-2/353円271円233円354円235円230円-352円262円275円353円241円234円-354円202円254円354円235円264円355円201円264円.js" new file mode 100644 index 0000000..4f536c6 --- /dev/null +++ "b/level-2/353円271円233円354円235円230円-352円262円275円353円241円234円-354円202円254円354円235円264円355円201円264円.js" @@ -0,0 +1,62 @@ +const DX = [-1, 1, 0, 0]; +const DY = [0, 0, -1, 1]; + +function solution(grid) { + const answer = []; + const visited = Array.from({ length: grid.length }, () => []).map((v) => { + for (let i = 0; i < grid[0].length; i += 1) { + v.push(new Array(4).fill(false)); + } + return v + }); + + for (let x = 0; x < grid.length; x += 1) { + for (let y = 0; y < grid[0].length; y += 1) { + for (let d = 0; d < 4; d += 1) { + if (!visited[x][y][d]) { + const stack = []; + stack.push([x, y, d]); + + let cnt = 0; + while (stack.length !== 0) { + const [currentX, currentY, currentD] = stack.pop(); + if (!visited[currentX][currentY][currentD]) { + visited[currentX][currentY][currentD] = true; + cnt += 1; + + const [nextX, nextY] = getNextXY(currentX, currentY, currentD, grid.length, grid[0].length); + const nextD = getNextD(grid[nextX][nextY], currentD) + + stack.push([nextX, nextY, nextD]) + } + + } + answer.push(cnt); + } + } + } + } + return answer.sort((a, b) => a - b); +} + + +function getNextXY(x, y, d, xLength, yLength) { + x += DX[d]; + y += DY[d]; + + if (x < 0) x = xLength - 1; + if (x>= xLength) x = 0; + if (y < 0) y = yLength - 1; + if (y>= yLength) y = 0; + + return [x, y]; +} + +function getNextD(command, d) { + if (command === 'L') { + d = [2, 3, 1, 0][d] + } else if (command === 'R') { + d = [3, 2, 0, 1][d] + } + return d +} From e8bb6516c6728c7a741129748a1e3bd723b3e8f2 Mon Sep 17 00:00:00 2001 From: minjongbaek Date: 2022年6月30日 17:21:35 +0900 Subject: [PATCH 3/6] =?UTF-8?q?Create=20k-=EC=A7=84=EC=88=98=EC=97=90?= =?UTF-8?q?=EC=84=9C-=EC=86=8C=EC=88=98-=EA=B0=9C=EC=88=98-=EA=B5=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...210230円-352円265円254円355円225円230円352円270円260円.js" | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 "level-2/k-354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" diff --git "a/level-2/k-354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" "b/level-2/k-354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" new file mode 100644 index 0000000..052f583 --- /dev/null +++ "b/level-2/k-354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" @@ -0,0 +1,13 @@ +function isPrime(number) { + if (number < 2) return false; + for (let i = 2; i * i <= number; i += 1) { + if (number % i === 0) { + return false; + } + } + return true; +} + +function solution(n, k) { + return (n).toString(k).split('0').filter((number) => isPrime(+number)).length; +} \ No newline at end of file From 05f6972439b58a67053aa83d661a7ce42516c38b Mon Sep 17 00:00:00 2001 From: minjongbaek Date: 2022年7月11日 14:21:21 +0900 Subject: [PATCH 4/6] =?UTF-8?q?Comment=20k=EC=A7=84=EC=88=98=EC=97=90?= =?UTF-8?q?=EC=84=9C-=EC=86=8C=EC=88=98-=EA=B0=9C=EC=88=98-=EA=B5=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0-352円265円254円355円225円230円352円270円260円.js" | 13 ----------- ...0-352円265円254円355円225円230円352円270円260円.js" | 23 +++++++++++++++++++ 2 files changed, 23 insertions(+), 13 deletions(-) delete mode 100644 "level-2/k-354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" create mode 100644 "level-2/k354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" diff --git "a/level-2/k-354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" "b/level-2/k-354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" deleted file mode 100644 index 052f583..0000000 --- "a/level-2/k-354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" +++ /dev/null @@ -1,13 +0,0 @@ -function isPrime(number) { - if (number < 2) return false; - for (let i = 2; i * i <= number; i += 1) { - if (number % i === 0) { - return false; - } - } - return true; -} - -function solution(n, k) { - return (n).toString(k).split('0').filter((number) => isPrime(+number)).length; -} \ No newline at end of file diff --git "a/level-2/k354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" "b/level-2/k354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" new file mode 100644 index 0000000..5425443 --- /dev/null +++ "b/level-2/k354円247円204円354円210円230円354円227円220円354円204円234円-354円206円214円354円210円230円-352円260円234円354円210円230円-352円265円254円355円225円230円352円270円260円.js" @@ -0,0 +1,23 @@ +// https://github.com/codeisneverodd/programmers-coding-test +// 완벽한 정답이 아닙니다. +// 정답 1 - minjongbaek +function isPrime(number) { // 소수를 판별하는 함수 + if (number < 2) return false; + for (let i = 2; i * i <= number; i += 1) { + if (number % i === 0) { + return false; + } + } + return true; +} + +function solution(n, k) { + // 문제를 얼핏 보면 4가지의 경우를 모두 생각해야할 것 같지만, + // 결국은 앞이나 뒤에 0이 하나라도 있거나 아예 없는 경우에 소수인지 확인하면 됩니다. + // 따라서 k진수로 변환 후 0을 기준으로 나누고 각 요소가 소수인지 판별하면 됩니다. + + // (n).toString(k) // n을 k진수로 변환합니다. + // .split('0') // 0을 기준으로 나눕니다. + // .filter((number) => isPrime(+number)).length // 소수가 아닌 요소를 걸러낸 후에 개수를 셉니다. + return (n).toString(k).split('0').filter((number) => isPrime(+number)).length; +} \ No newline at end of file From 459591e9b178c768d62a332daea8a57cf581889d Mon Sep 17 00:00:00 2001 From: minjongbaek Date: 2022年7月11日 14:53:10 +0900 Subject: [PATCH 5/6] =?UTF-8?q?Comment=20[3=EC=B0=A8]-=EB=B0=A9=EA=B8=88?= =?UTF-8?q?=EA=B7=B8=EA=B3=A1=20=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?+=20=EB=8C=80=EC=8B=A0=20Number()=20=ED=95=A8=EC=88=98=EB=A1=9C?= =?UTF-8?q?=20=ED=98=95=EB=B3=80=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...51352円270円210円352円267円270円352円263円241円.js" | 42 +++++++++++++++++++ ...1352円270円210円-352円267円270円352円263円241円.js" | 27 ------------ 2 files changed, 42 insertions(+), 27 deletions(-) create mode 100644 "level-2/[3354円260円250円]-353円260円251円352円270円210円352円267円270円352円263円241円.js" delete mode 100644 "level-2/353円260円251円352円270円210円-352円267円270円352円263円241円.js" diff --git "a/level-2/[3354円260円250円]-353円260円251円352円270円210円352円267円270円352円263円241円.js" "b/level-2/[3354円260円250円]-353円260円251円352円270円210円352円267円270円352円263円241円.js" new file mode 100644 index 0000000..20404da --- /dev/null +++ "b/level-2/[3354円260円250円]-353円260円251円352円270円210円352円267円270円352円263円241円.js" @@ -0,0 +1,42 @@ +// https://github.com/codeisneverodd/programmers-coding-test +// 완벽한 정답이 아닙니다. +// 정답 1 - minjongbaek +function convertString(m) { // 문자열 m에 #이 붙은 음이 있다면 #을 제거하고 소문자로 변경한 후 반환하는 함수 + return m + .replace(/C#/g, 'c') + .replace(/D#/g, 'd') + .replace(/F#/g, 'f') + .replace(/G#/g, 'g') + .replace(/A#/g, 'a'); +} + +function solution(m, musicinfos) { + + // 네오가 기억하고 있는 멜로디가 라디오에서 재생됐는지 확인해야합니다. + // 재생시간이 길면 악보의 멜로디가 반복되어 재생되고, 짧다면 중간에 끊어지게 됩니다. + // #이 붙은 음은 2자리를 차지하기 때문에 #이 붙은 음을 어떻게 처리할지가 중요합니다. + + const listenSound = convertString(m); // #이 붙은 음을 다른 문자로 변환합니다. + + const map = new Map(); // 조건에 일치하는 음악 정보를 저장할 map 변수를 선언합니다. + for (const info of musicinfos) { + const [start, finish, title, _score] = info.split(','); + // 음악 재생이 끝난 시각과 재생된 시각의 차를 구하여 재생시간을 구합니다. + const duration = ((Number(finish.slice(0, 2)) * 60) + (Number(finish.slice(3, 5)))) - ((Number(start.slice(0, 2)) * 60) + (Number(start.slice(3, 5)))); + + const score = convertString(_score); // 악보의 멜로디에서 #이 붙은 음을 다른 문자로 변환합니다. + + // 재생된 멜로디를 구합니다. + // 각 음이 1분에 1개씩 재생되므로, repeat() 메서드를 사용하여 재생시간을 악보의 길이로 나눈 몫 만큼 반복합니다. + // slice() 메서드로 재생시간을 넘어가는 멜로디는 제외합니다. + const playScore = score.repeat(Math.ceil(duration / score.length)).slice(0, duration); + if (playScore.includes(listenSound)) { // 들은 멜로디가 재생된 멜로디에 포함되어 있다면 map에 저장한다. + map.set(title, {score, playScore}); + } + } + + // 조건에 일치하는 음악이 여러개인 경우 재생된 시간이 제일 길고 먼저 입력된 음악 제목을 반환합니다. + // map 객체는 삽입에 대한 순서를 기억하므로 재생된 시간이 제일 긴 음악부터 내림차순으로 정렬합니다. + const filter = [...map.keys()].sort((a,b) => map.get(b).playScore.length - map.get(a).playScore.length); + return filter.length>= 1 ? filter[0] : '(None)'; // 결과가 없다면 '(None)'을 반환하고, 그렇지 않다면 첫 번째 요소를 반환합니다. +} \ No newline at end of file diff --git "a/level-2/353円260円251円352円270円210円-352円267円270円352円263円241円.js" "b/level-2/353円260円251円352円270円210円-352円267円270円352円263円241円.js" deleted file mode 100644 index 340a08c..0000000 --- "a/level-2/353円260円251円352円270円210円-352円267円270円352円263円241円.js" +++ /dev/null @@ -1,27 +0,0 @@ -function convertString(m) { - return m - .replace(/C#/g, 'c') - .replace(/D#/g, 'd') - .replace(/F#/g, 'f') - .replace(/G#/g, 'g') - .replace(/A#/g, 'a'); -} - -function solution(m, musicinfos) { - const listenSound = convertString(m); - - const map = new Map(); - for (const info of musicinfos) { - const [start, finish, title, _score] = info.split(','); - const duration = ((+finish.slice(0, 2) * 60) + (+finish.slice(3, 5))) - ((+start.slice(0, 2) * 60) + (+start.slice(3, 5))); - - const score = convertString(_score); - const playScore = score.repeat(Math.ceil(duration / score.length)).slice(0, duration); - if (playScore.includes(listenSound)) { - map.set(title, {score, playScore}); - } - } - - const filter = [...map.keys()].sort((a,b) => map.get(b).playScore.length - map.get(a).playScore.length); - return filter.length>= 1 ? filter[0] : '(None)'; -} \ No newline at end of file From 7d3d17ab370ef6118f3f2ff8ca581b7d12e44e77 Mon Sep 17 00:00:00 2001 From: minjongbaek Date: 2022年7月11日 15:13:11 +0900 Subject: [PATCH 6/6] =?UTF-8?q?Comment=20=EB=B9=9B=EC=9D=98-=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C-=EC=82=AC=EC=9D=B4=ED=81=B4=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4-354円202円254円354円235円264円355円201円264円.js" | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git "a/level-2/353円271円233円354円235円230円-352円262円275円353円241円234円-354円202円254円354円235円264円355円201円264円.js" "b/level-2/353円271円233円354円235円230円-352円262円275円353円241円234円-354円202円254円354円235円264円355円201円264円.js" index 4f536c6..8281b8c 100644 --- "a/level-2/353円271円233円354円235円230円-352円262円275円353円241円234円-354円202円254円354円235円264円355円201円264円.js" +++ "b/level-2/353円271円233円354円235円230円-352円262円275円353円241円234円-354円202円254円354円235円264円355円201円264円.js" @@ -1,8 +1,19 @@ +// https://github.com/codeisneverodd/programmers-coding-test +// 완벽한 정답이 아닙니다. +// 정답 1 - minjongbaek + +// 빛의 이동을 위한 DX, DY 변수를 선언합니다. const DX = [-1, 1, 0, 0]; const DY = [0, 0, -1, 1]; function solution(grid) { + + // DFS에 4방향을 고려하여 문제를 풉니다. + // 핵심은 이미 방문한 칸이고 방향이 동일하다면 하나의 사이클이 형성된 것으로 생각해야합니다. + const answer = []; + + // visited 변수를 선언 후 방문 여부를 확인할 3차원 배열을 할당합니다. [x좌표, y좌표, [하, 상, 좌, 우]] const visited = Array.from({ length: grid.length }, () => []).map((v) => { for (let i = 0; i < grid[0].length; i += 1) { v.push(new Array(4).fill(false)); @@ -13,6 +24,7 @@ function solution(grid) { for (let x = 0; x < grid.length; x += 1) { for (let y = 0; y < grid[0].length; y += 1) { for (let d = 0; d < 4; d += 1) { + // x, y 좌표에 하, 상, 좌, 우 방향으로 방문한 적이 없다면 dfs를 수행합니다. if (!visited[x][y][d]) { const stack = []; stack.push([x, y, d]); @@ -24,8 +36,8 @@ function solution(grid) { visited[currentX][currentY][currentD] = true; cnt += 1; - const [nextX, nextY] = getNextXY(currentX, currentY, currentD, grid.length, grid[0].length); - const nextD = getNextD(grid[nextX][nextY], currentD) + const [nextX, nextY] = getNextXY(currentX, currentY, currentD, grid.length, grid[0].length); // 다음으로 이동할 좌표를 구합니다. + const nextD = getNextD(grid[nextX][nextY], currentD) // x, y 칸에 적혀있는 문자열대로 방향을 다음 방향을 구합니다. stack.push([nextX, nextY, nextD]) } @@ -39,11 +51,12 @@ function solution(grid) { return answer.sort((a, b) => a - b); } - +// 다음 행선지를 구하는 함수 function getNextXY(x, y, d, xLength, yLength) { x += DX[d]; y += DY[d]; + // x나 y의 값이 유효하지 않은 경우 값을 재할당합니다. if (x < 0) x = xLength - 1; if (x>= xLength) x = 0; if (y < 0) y = yLength - 1; @@ -52,6 +65,7 @@ function getNextXY(x, y, d, xLength, yLength) { return [x, y]; } +// 현재 방향과 칸에 표시된 문자를 기준으로 다음 행선지의 방향을 구하는 함수 function getNextD(command, d) { if (command === 'L') { d = [2, 3, 1, 0][d]

AltStyle によって変換されたページ (->オリジナル) /