diff --git a/jonghopark95/week3/problem1.js b/jonghopark95/week3/problem1.js new file mode 100644 index 0000000..aed825d --- /dev/null +++ b/jonghopark95/week3/problem1.js @@ -0,0 +1,64 @@ +const solution = (rows, columns, queries) => { + let answer = []; + + const matrix = createDefaultMatrix(rows, columns); + + queries.forEach((query) => { + const { rotatedElement } = rotateMatrix(query, matrix); + const minValue = getMinValue(rotatedElement); + answer.push(minValue); + }); + + return answer; +}; + +const rotateMatrix = (query, matrix) => { + const rotatedElement = []; + + let [sR, sC, eR, eC] = query; + sR--; sC--; eR--; eC--; + const defaultX = sR; + const defaultY = sC; + let x = defaultX + 1; + let y = defaultY; + const defaultElement = matrix[x][y]; + + while (!(x === defaultX && y === defaultY)) { + const prevX = x; + const prevY = y; + if (x === sR && y !== sC) y--; + else if (x !== sR && y === eC) x--; + else if (x === eR && y !== eC) y++; + else if (x !== eR && y === sC) x++; + + matrix[prevX][prevY] = matrix[x][y]; + rotatedElement.push(matrix[x][y]); + } + matrix[defaultX][defaultY] = defaultElement; + rotatedElement.push(matrix[defaultX][defaultY]); + + return { rotatedElement }; +}; + +const createDefaultMatrix = (rows, cols) => { + let defaultMatrix = []; + + for (let i = 0; i < rows; i++) { + let numbersInOneColumn = []; + for (let j = i * rows; j < i * rows + cols; j++) { + numbersInOneColumn.push(j + 1); + } + defaultMatrix.push(numbersInOneColumn); + } + + return defaultMatrix; +}; + +const getMinValue = (array) => { + const min = array.reduce((acc, curr) => { + if (curr < acc) acc = curr; + return acc; + }, Infinity); + + return min; +}; diff --git a/jonghopark95/week3/problem2.js b/jonghopark95/week3/problem2.js new file mode 100644 index 0000000..57cfccc --- /dev/null +++ b/jonghopark95/week3/problem2.js @@ -0,0 +1,78 @@ +const solution = (s) => { + let answer = 0; + let target = s; + + for (let i = 0; i < target.length; i++) { + const firstCharacter = target[0]; + const remainder = target.slice(1, target.length); + target = `${remainder}${firstCharacter}`; + + const isValid = checkIsValidBracketString(target); + if (isValid) answer++; + } + + return answer; +}; + +/** + * 현재 string의 bracket 들의 짝이 정상적인지 확인합니다. + * 만약 string이 남아있는데 + * 남아있는 string이 홀수의 길이이거나, + * close bracket이 없거나, + * close bracket의 이전 bracket이 match 되지 않는다면 + * false를 반환합니다. + */ +const checkIsValidBracketString = (string) => { + let trimmedString = string; + + while (trimmedString !== "") { + const { bracket: closeBracket, pos } = findCloseBracket(trimmedString); + const prevChar = trimmedString[pos - 1]; + + if (string.length % 2 === 1) return false; + if (closeBracket === undefined) return false; + if (prevChar !== getPairedBracket(closeBracket)) return false; + + const bracketPair = trimmedString.substr(pos - 1, 2); + trimmedString = trimmedString.replace(bracketPair, ""); + } + + return true; +}; + +/** + * close bracket과 짝을 이루는 bracket을 반환합니다. + */ +const getPairedBracket = (closeBracket) => { + const BRACKETS = { + "]": "[", + ")": "(", + "}": "{", + }; + return BRACKETS[closeBracket]; +}; + +/** + * 현 string에서, + * 가장 가까운 close bracket을 찾습니다. + */ +const findCloseBracket = (s) => { + let bracket = ""; + let pos = ""; + + for (let i = 0; i < s.length; i++) { + const currCharacter = s[i]; + + if (isCloseBracket(currCharacter)) { + bracket = currCharacter; + pos = i; + break; + } + } + + return { bracket, pos }; +}; + +const isCloseBracket = (bracket) => + CLOSE_BRACKET.includes(bracket) ? true : false; +const CLOSE_BRACKET = ["]", ")", "}"];