From 539884a0c648e3ed9065fdccc2cb87eb104d457a Mon Sep 17 00:00:00 2001 From: lomuto Date: Sun, 26 Jun 2022 13:51:35 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[=EA=B0=95=EC=9C=A4=EC=84=9D]=2015=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...t_\352\260\225\354\234\244\354\204\235.js" | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 "15\354\243\274\354\260\250/(P)17679/17679_javascript_\352\260\225\354\234\244\354\204\235.js" diff --git "a/15\354\243\274\354\260\250/(P)17679/17679_javascript_\352\260\225\354\234\244\354\204\235.js" "b/15\354\243\274\354\260\250/(P)17679/17679_javascript_\352\260\225\354\234\244\354\204\235.js" new file mode 100644 index 0000000..ce11200 --- /dev/null +++ "b/15\354\243\274\354\260\250/(P)17679/17679_javascript_\352\260\225\354\234\244\354\204\235.js" @@ -0,0 +1,85 @@ +// 입력값 확인 잘해야함. 문자열의 배열이라 문자열을 문자 배열로 한번 풀어줘야지 안그러면 나중에 문자열을 []로 assing 할 때 오류안나면서 문자열 안바뀜 +// js는 segfault 없어서 range 체크 안해두 된다는 장점이 있음 +// Array(len0).fill(Array(len1)) 하게되면 큰일나는게 len0 * len1 배열이 생기는데 열이 다 같은 배열 참조하는꼴이됨 +// + +function solution(m, n, board) { + var answer = recursiveCheck(m, n, board.map((s) => Array.from(s))); + return answer; +} + +function recursiveCheck(rowSize, colSize, board) { + const logBoard = getLogBoard(rowSize, colSize); + + for(let r = 0; r < rowSize; r++) { + for(let c = 0; c < colSize; c++) { + checkFourBlock(r, c, board, logBoard); + } + } + + const popCount = logBoard.reduce((acc, col) => { + return acc + col.reduce((acc, curr) => curr ? acc + 1 : acc, 0); + }, 0); + + if(popCount === 0) { + return popCount; + } + dragDownBoard(rowSize, colSize, board, logBoard); + return recursiveCheck(rowSize, colSize, board) + popCount; +} + +function checkFourBlock(r, c, board, logBoard) { + if( + !isValidCoordinate(r + 1, c, board) || + !isValidCoordinate(r, c + 1, board) || + !isValidCoordinate(r + 1, c + 1, board) + ) { + return; + } + + const block = board[r][c]; + if ( + block === board[r+1][c] && + block === board[r][c+1] && + block === board[r+1][c+1] + ) { + if(block !== "X"){ + logBoard[r][c] = logBoard[r+1][c] = logBoard[r][c + 1] = logBoard[r+1][c+1] = true; + } + } +} + +function isValidCoordinate(r, c, board) { + return r >= 0 && c >= 0 && r < board.length && c < board[0].length; +} + +function getLogBoard(rowSize, colSize) { + return Array(rowSize).fill(0).map(m => Array(colSize)); +} + +function dragDownBoard(rowSize, colSize, board, logBoard) { + for(let c = 0; c < colSize; c++) { + const buf = []; + let r = rowSize - 1; + + while(r >= 0) { + if(!logBoard[r][c]) { + buf.push(board[r][c]); + } + r--; + } + + buf.reverse(); // Js unshift O(N)이라 뒤집어서 pop 하는게 빠름 + + r = rowSize - 1; + while(buf.length > 0) { + board[r][c] = buf.pop(); + r--; + } + + while(r >= 0) { + board[r][c] = "X"; + r--; + } + } +} \ No newline at end of file From 51c5e22fbc1e7c60abfdbcaead129b1da53765b8 Mon Sep 17 00:00:00 2001 From: lomuto Date: Sun, 26 Jun 2022 23:22:36 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=EA=B0=95=EC=9C=A4=EC=84=9D=20[16=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8]=20=EA=B3=BC=EC=A0=9C=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...s_\352\260\225\354\234\244\354\204\235.js" | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 "16\354\243\274\354\260\250/(P)17677/17677_js_\352\260\225\354\234\244\354\204\235.js" diff --git "a/16\354\243\274\354\260\250/(P)17677/17677_js_\352\260\225\354\234\244\354\204\235.js" "b/16\354\243\274\354\260\250/(P)17677/17677_js_\352\260\225\354\234\244\354\204\235.js" new file mode 100644 index 0000000..c97ca73 --- /dev/null +++ "b/16\354\243\274\354\260\250/(P)17677/17677_js_\352\260\225\354\234\244\354\204\235.js" @@ -0,0 +1,73 @@ +function solution(str1, str2) { + + const [ str1Map, str2Map ] = [str1, str2] + .map(str => get2WordChunks(str)) + .map(chunk => getMapOfArr(chunk)); + + const dividend = getDividend(str1Map, str2Map); + const divisor = getDivisor(str1Map, str2Map); + + if(dividend === 0 && divisor === 0) { + return 65536 + } + + return Math.floor(65536 * (dividend / divisor)) +} + +function getMapOfArr(strArr) { + const map = new Map(); + + strArr.forEach(str => { + if(map.has(str) === false) { + map.set(str, 0); + } + + map.set(str, map.get(str) + 1); + }) + + return map; +} + +function getDividend(str1Map, str2Map) { + let count = 0; + + for(const [ k, v ] of str1Map) { + if(str2Map.has(k)) { + count += Math.min(str2Map.get(k), v) + } + } + + return count; +} + +function getDivisor(str1Map, str2Map) { + const map = new Map(str1Map); + + for(const [ k, v ] of str2Map) { + if(map.has(k)) { + map.set(k, Math.max(v, map.get(k))) + } else { + map.set(k, v); + } + } + + return Array.from(map.values()).reduce((acc, curr) => acc + curr, 0); +} + +function get2WordChunks(str) { + return Array.from(str) + .reduce((acc, curr, index) => { + if(index === str.length - 1) { + return acc; + } + + acc.push(`${curr}${str[index+1]}`); + return acc; + }, []) + .filter((chunk) => isAlpha(chunk[0])&&isAlpha(chunk[1])) + .map((ch) => ch.toLowerCase()) +} + +function isAlpha(ch) { + return (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z"); +} \ No newline at end of file From dedb1a0d1d200604bb478aa11369afe59870bb31 Mon Sep 17 00:00:00 2001 From: lomuto Date: Thu, 30 Jun 2022 00:34:54 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[=EA=B0=95=EC=9C=A4=EC=84=9D]=2016=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...s_\352\260\225\354\234\244\354\204\235.js" | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 "16\354\243\274\354\260\250/(P)81302/81302_js_\352\260\225\354\234\244\354\204\235.js" diff --git "a/16\354\243\274\354\260\250/(P)81302/81302_js_\352\260\225\354\234\244\354\204\235.js" "b/16\354\243\274\354\260\250/(P)81302/81302_js_\352\260\225\354\234\244\354\204\235.js" new file mode 100644 index 0000000..66a5828 --- /dev/null +++ "b/16\354\243\274\354\260\250/(P)81302/81302_js_\352\260\225\354\234\244\354\204\235.js" @@ -0,0 +1,83 @@ +function solution(places) { + return places.map((p) => { + const place = p.map((str) => Array.from(str)); + + console.log(place) //log + + for(let row = 0; row < place.length; row++) { + for(let col = 0; col < place[0].length; col++) { + if(place[row][col] !== "P") { + continue; + } + + if(isDistanceOK(place, row, col) === false) { + console.log(`Not ok at [${row},${col}]`) //log + return 0; + } + } + } + return 1; + }); +} + +const manhatan1 = [[0,1], [1,0], [0,-1], [-1,0]]; +const manhatan2 = [[1,1], [1,-1], [-1,1], [-1,-1]]; +const manhatan2Far = [[0, 2], [2,0], [-2,0], [0,-2]]; + +function isDistanceOK(places, row, col) { + console.log(`Person at [${row},${col}]`) //log + + const manhatan1People = manhatan1.filter(([r, c]) => { + const nr = row + r; + const nc = col + c; + + return isPosValid(places, nr, nc) && places[nr][nc] === "P"; + }) + + if(manhatan1People.length > 0) { + return false; + } + + const manhatan2People = manhatan2.filter(([r, c]) => { + const nr = row + r; + const nc = col + c; + + return isPosValid(places, nr, nc) && places[nr][nc] === "P"; + }); + + if(manhatan2People.length > 0) { + for(const [r, c] of manhatan2People) { + if(places[row][col + c] !== "X" || places[r + row][col] !== "X") { + return false; + } + } + } + + const manhatan2FarPeople = manhatan2Far.filter(([r, c]) => { + const nr = row + r; + const nc = col + c; + + return isPosValid(places, nr, nc) && places[nr][nc] === "P"; + }); + + if(manhatan2FarPeople.length === 0) { + return true; + } + + for(const [r, c] of manhatan2FarPeople) { + if(r === 0 && places[row][col + c/2] !== "X") { + return false; + } + + if(c === 0 && places[row + r/2][col] !== "X") { + + return false; + } + } + + return true; +} + +function isPosValid(places, row, col) { + return places[row] && places[row][col]; +} \ No newline at end of file From 16d8e0e3c3ca34e4dfcf5d1bb799986303ce8ed5 Mon Sep 17 00:00:00 2001 From: lomuto Date: Wed, 6 Jul 2022 01:22:11 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[=EA=B0=95=EC=9C=A4=EC=84=9D]=2017=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...n_\353\205\270\354\234\240\353\271\210.py" | 70 +++++++++++++++ ...n_\353\205\270\354\234\240\353\271\210.py" | 89 +++++++++++++++++++ ...n_\353\205\270\354\234\240\353\271\210.py" | 13 +++ ...s_\352\260\225\354\234\244\354\204\235.js" | 69 ++++++++++++++ 4 files changed, 241 insertions(+) create mode 100644 "15\354\243\274\354\260\250/(P)17679/(P)17679_Python_\353\205\270\354\234\240\353\271\210.py" create mode 100644 "15\354\243\274\354\260\250/2146/(P)72412_python_\353\205\270\354\234\240\353\271\210.py" create mode 100644 "15\354\243\274\354\260\250/2146/2146_python_\353\205\270\354\234\240\353\271\210.py" create mode 100644 "17\354\243\274\354\260\250/(P)60059/60059_js_\352\260\225\354\234\244\354\204\235.js" diff --git "a/15\354\243\274\354\260\250/(P)17679/(P)17679_Python_\353\205\270\354\234\240\353\271\210.py" "b/15\354\243\274\354\260\250/(P)17679/(P)17679_Python_\353\205\270\354\234\240\353\271\210.py" new file mode 100644 index 0000000..cb80d1c --- /dev/null +++ "b/15\354\243\274\354\260\250/(P)17679/(P)17679_Python_\353\205\270\354\234\240\353\271\210.py" @@ -0,0 +1,70 @@ +# 나머지 테스트 코드는 통과했지만 테스트 코드 10번 정확성 실패, 테스트 코드 2번 효율성 실패이다. + + + + +# 제거되는 블럭들을 '0' 으로 치환 후 제거한 후 값이 '0'인 블럭 위의 블럭이 대치 후 list 리턴 해주기. 제거되는 블럭이 없다면 false 리턴. + +def remove(a): + list = [] + + # 제거될 블럭 중 가장 왼쪽위 의 블럭의 좌표를 list 에 담기. + for i in range(0,len(a)-1): + for j in range(0,len(a[0])-1): + if a[i][j]==a[i+1][j] and a[i][j]==a[i][j+1] and a[i][j]==a[i+1][j+1]: + list.append([i,j]) + + + # list 가 비었으면 false 리턴 + if len(list)==0: + return False + + else: + # 비었지 않다면 그 블럭 포함 4개의 블럭 값을 '0' 으로 치환. + for i in range(0,len(list)): + a[list[i][0]][list[i][1]]='0' + a[list[i][0]+1][list[i][1]]='0' + a[list[i][0]][list[i][1]+1]='0' + a[list[i][0]+1][list[i][1]+1]='0' + + # 아래 블럭의 값이 '0' 이라면 자신의 값을 '0' 으로 바꾸고 아래 블럭 값을 자신의 블럭 값으로 바꾸기. + for i in range(0,len(a)-1): + for j in range(0,len(a[0])): + if a[i+1][j] == '0': + a[i+1][j] = a[i][j] + a[i][j] = '0' + + # 변경된 리스트 리턴 + return a + + + + +def solution(m, n, board): + + # m:높이, n:폭 + + answer = 0 + a = [ ] + + str = [ ] + + # board를 문자를 기준으로 나누고 리스트에 저장 + + for i in range(0,len(board)): + for j in range(0,len(board[i])): + str.append(board[i][j]) + a.append(str) + str = [] + + # compare 함수에서 false 조건이 잘 나오지 않아 반복문으로 돌림 + for i in range(0,m*n): + a=remove(a) + + + # 값이 '0' 인 블럭이 제거된 블럭이기에 그 수를 셈. + for i in range(0,len(a)): + answer += a[i].count('0') + + + return answer diff --git "a/15\354\243\274\354\260\250/2146/(P)72412_python_\353\205\270\354\234\240\353\271\210.py" "b/15\354\243\274\354\260\250/2146/(P)72412_python_\353\205\270\354\234\240\353\271\210.py" new file mode 100644 index 0000000..364f0f4 --- /dev/null +++ "b/15\354\243\274\354\260\250/2146/(P)72412_python_\353\205\270\354\234\240\353\271\210.py" @@ -0,0 +1,89 @@ + +# 정확성은 통과했지만 효율성을 통과하지 못했다. + + + +# 리스트 a,b 비교 함수 (Score 제외, 조건이 일치하는 않는 것이 하나라도 있으면 False 반환 ) + +def compare(a,b): + for i in range(0,len(b)): + if b[i] not in a: + return False + + return True + + +# Score 비교 함수 + +def score_compare(a,b): + a_score = "" + b_score = "" + + for i in range(0,len(a)): + if a[i].isdigit()==True: + a_score+=a[i] + + for i in range(0,len(b)): + if b[i].isdigit()==True: + b_score+=b[i] + + return int(a_score)>=int(b_score) + + + + +def solution(info, query): + answer = 0 + + ans = [] + + # 2차원 리스트 초기화 + + a = [[]*2 for i in range(len(query))] + + + # query의 각 항목들을 추출해서 리스트 a에 넣기 + + for i in range(len(query)): + if "cpp" in query[i]: + a[i].append("cpp") + + if "java" in query[i]: + a[i].append("java") + + if "python" in query[i]: + a[i].append("python") + + if "backend" in query[i]: + a[i].append("backend") + + if "frontend" in query[i]: + a[i].append("frontend") + + if "junior" in query[i]: + a[i].append("junior") + + if "senior" in query[i]: + a[i].append("senior") + + if "chicken" in query[i]: + a[i].append("chicken") + + if "pizza" in query[i]: + a[i].append("pizza") + + + + # compare 함수를 이용해서 조건에 맞는 answer 개수 세기 + + for i in range(0,len(a)): + for j in range(0,len(info)): + if compare(info[j],a[i])==True and score_compare(info[j],query[i])==True: + answer+=1 + ans.append(answer) + answer=0 + + + + + return ans diff --git "a/15\354\243\274\354\260\250/2146/2146_python_\353\205\270\354\234\240\353\271\210.py" "b/15\354\243\274\354\260\250/2146/2146_python_\353\205\270\354\234\240\353\271\210.py" new file mode 100644 index 0000000..ebefbe6 --- /dev/null +++ "b/15\354\243\274\354\260\250/2146/2146_python_\353\205\270\354\234\240\353\271\210.py" @@ -0,0 +1,13 @@ +# 잘 모르겠다.. + + + +# 첫 줄에는 지도의 크기 N(100이하의 자연수)가 주어진다. +# 그 다음 N줄에는 N개의 숫자가 빈칸을 사이에 두고 주어지며, 0은 바다, 1은 육지를 나타낸다. +# 항상 두 개 이상의 섬이 있는 데이터만 입력으로 주어진다. + + +N = int(input()) +map = input() + +# 각 섬 별 숫자를 다르게 표기하기 \ No newline at end of file diff --git "a/17\354\243\274\354\260\250/(P)60059/60059_js_\352\260\225\354\234\244\354\204\235.js" "b/17\354\243\274\354\260\250/(P)60059/60059_js_\352\260\225\354\234\244\354\204\235.js" new file mode 100644 index 0000000..a96687b --- /dev/null +++ "b/17\354\243\274\354\260\250/(P)60059/60059_js_\352\260\225\354\234\244\354\204\235.js" @@ -0,0 +1,69 @@ +function solution(key, lock) { + const holeCount = lock.reduce((sum, row) => { + sum += row.reduce((sum, curr) => curr === 0 ? sum + 1 : sum, 0); + + return sum; + }, 0); + + + let degree = 0; + + while(degree <= 360) { + if(check(key, lock, holeCount)) { + return true; + } + + rotate90(key, key.length); + degree += 90; + } + + return false; +} + +function rotate90(key, size) { + // 깊은 복사가 아니라 얕은 복사로 카피떠서 여기서 존나 헤맸음 + const temp = key.map((row) => row.map((e) => e)); + + for(let col = 0; col < size; col++) { + for(let row = size - 1; row >= 0; row --) { + key[col][size - row - 1] = temp[row][col]; + } + } +} + +function check(key, lock, holeCount) { + for(let rowDiff = -1 * (key.length - 1) ; rowDiff < lock.length + key.length - 1 ; rowDiff++) { + for(let colDiff = -1 * (key.length - 1) ; colDiff < lock.length + key.length - 1 ; colDiff++) { + if(checkFit(key, lock, rowDiff, colDiff, holeCount)) { + return true; + } + } + } + + return false; +} + +function checkFit(key, lock, rowDiff, colDiff, holeCount) { + let count = 0; + + for(let keyRow = 0 ; keyRow < key.length; keyRow++) { + for(let keyCol = 0 ; keyCol < key.length; keyCol++) { + const lockRow = keyRow + rowDiff; + const lockCol = keyCol + colDiff; + + if(lock[lockRow] === undefined || lock[lockRow][lockCol] === undefined) { + continue; + } + + if(key[keyRow][keyCol] === 1) { + if(lock[lockRow][lockCol] === 1){ + return false; + } + + count++; + } + } + } + + return count === holeCount; +} \ No newline at end of file From eb709f78199dcc05ec4b6c2efeb1048629ff5b2f Mon Sep 17 00:00:00 2001 From: lomuto Date: Fri, 8 Jul 2022 23:41:26 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[=EA=B0=95=EC=9C=A4=EC=84=9D]=20<=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EC=B4=88=EA=B3=BC>17=EC=A3=BC=EC=B0=A8=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C=20=EC=A0=9C=EC=B6=9C=ED=95=A9=EB=8B=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...s_\352\260\225\354\234\244\354\204\235.js" | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 "17\354\243\274\354\260\250/20055/20055_js_\352\260\225\354\234\244\354\204\235.js" diff --git "a/17\354\243\274\354\260\250/20055/20055_js_\352\260\225\354\234\244\354\204\235.js" "b/17\354\243\274\354\260\250/20055/20055_js_\352\260\225\354\234\244\354\204\235.js" new file mode 100644 index 0000000..294f79e --- /dev/null +++ "b/17\354\243\274\354\260\250/20055/20055_js_\352\260\225\354\234\244\354\204\235.js" @@ -0,0 +1,101 @@ +const readline = require("readline"); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +const input = []; + +rl.on("line", (line) => { + input.push(line); +}).on("close", () => { + + const [beltHalfLength, segmentToDestroy] = input[0].split(" ").map(e => Number(e)); + const belt = input[1].split(" ").map(e => { return { hasRobot: false, durability: Number(e) } }); + + console.log(solution(belt, beltHalfLength, segmentToDestroy)); + process.exit(); +}) + +const solution = (belt, beltHalfLength, segmentToDestroy) => { + const robotPositions = []; + + let brokenBelt = 0; + let count = 0; + + while (brokenBelt < segmentToDestroy) { + + // 1. 벨트가 로봇과 함께 회전 + rotateBelt(belt); + robotPositions.forEach((v, i) => { + if (v === undefined) { + return; + } + + robotPositions[i] = v + 1 >= beltHalfLength * 2 ? 0 : v + 1; + }) + + // 로봇 내리자 + departingRobotIndex = robotPositions.findIndex((rp) => rp === beltHalfLength - 1); + if (departingRobotIndex > -1) { + belt[robotPositions[departingRobotIndex]].hasRobot = false; + robotPositions[departingRobotIndex] = undefined; + } + + // 2. 로봇 이동 + robotPositions.forEach((robotPosition, i) => { + if (robotPosition === undefined) { + return; + } + + const nextPosition = robotPosition + 1 >= beltHalfLength * 2 ? 0 : robotPosition + 1; + + if (belt[nextPosition].hasRobot || belt[nextPosition].durability === 0) { + return; + } + + belt[robotPosition].hasRobot = false; + belt[nextPosition].hasRobot = true; + belt[nextPosition].durability -= 1; + + if (belt[nextPosition].durability === 0) { + brokenBelt++; + } + + robotPositions[i] = nextPosition; + }) + + // 로봇 내리자 + departingRobotIndex = robotPositions.findIndex((rp) => rp === beltHalfLength - 1); + if (departingRobotIndex > -1) { + belt[robotPositions[departingRobotIndex]].hasRobot = false; + robotPositions[departingRobotIndex] = undefined; + } + + // 3. 로봇 올리기 + if (belt[0].durability > 0 && belt[0].hasRobot === false) { + belt[0].durability -= 1; + if (belt[0].durability === 0) { + brokenBelt++; + } + + belt[0].hasRobot = true; + robotPositions.push(0); + } + + // console.log(belt); + // console.log(robotPositions); + count++; + } + + return count; +} + +const rotateBelt = (belt) => { + const temp = belt[belt.length - 1]; + for (let i = belt.length - 1; i > 0; i--) { + belt[i] = belt[i - 1]; + }; + + belt[0] = temp; +} \ No newline at end of file