2021년 09월 04일
N x N 크기의 2차원 배열을 시계방향으로 90도씩 회전하려 합니다. 다음은 2 x 2 크기의 2차원 배열을 시계방향으로 90도씩 회전하는 예시입니다.
// Example ( 2x2 )
[
[1, 2],
[3, 4],
][
// After ( 1회 회전 )
([3, 1], [4, 2])
][
// Example ( 2x2 )
([1, 2], [3, 4])
][
// After ( 2회 회전 )
([4, 3], [2, 1])
][
// Example ( 3x3 )
([4, 1, 2], [7, 3, 4], [3, 5, 6])
][
// After ( 3회 회전 )
([2, 4, 6], [1, 3, 5], [4, 7, 3])
];
!! 정답제출 후 업데이트하지 않은 코드여서 안돌아갈 수 있어요!
const rotateMatrix = (matrix, r) => {
if (!r) return matrix;
let temp = new Array(matrix.length)
.fill(0)
.map(() => new Array(matrix.length).fill(0));
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix.length; j++) {
if (!temp[i][j]) {
temp[i][j] = 0;
}
temp[i][j] = matrix[matrix.length - j - 1][i];
}
}
return rotateMatrix(temp, r - 1);
};
const solution = (matrix, r) => {
return r % 4 ? rotateMatrix(matrix, r % 4) : matrix;
};
2022년 03월 11일
출퇴근 서비스를 만들었지만, 그룹웨어의 다른 기능들을 사용하려면 결국 그룹웨어 페이지에서 QR코드를 인증해야했다. 나는 console에 스크립트를 입력하여 로그인하다보니 상관 없었지만, 다른 사람들에게 개발자 도구 켜서 스크립트 입력하세요라고 알려주기에는 비개발자들이 접근하기 어려웠다. ## 크롬 플러그인 처음에는 출퇴근 페이지에서 한번에 처리하는게 편하다고 생각했지만, CORS 이슈와 쿠키 셋팅하는 부분에서 우회하는 처리가 까다로웠다. 시간을 많이 소요하기에는 임펙트가 없다고 생각하기에 플러그인으로 CORS를 해결하고 API를 다이렉트로 호출하여 setCookie를 받으면 빠르게 작업 처리가 가능하다고 판단하여 크롬 플러그인 형태로 진행했다. ## 결과물 그룹웨어 로그인 플러그인
2022년 01월 02일
회사 합병으로 기존 출퇴근과 법인카드 사용 방식이 변경되었고, 그룹웨어 페이지에 접속하여 수기 진행하는 방식으로 제공되었다. 그룹웨어의 출퇴근 방식은 PC로만 제공되어서 `모바일로 출퇴근이 불가능`했고, 노트북을 회사에 두고 다니는 사람들은 퇴근을 누르지않아 `회사로 복귀하는 상황이 지속적으로 발생`했다. 또한 법인카드 사용내역 등록 방식이 복잡해지면서 혼란이 가중되고 `직원들이 불편함을 호소`했다. 기존처럼 모바일로 출퇴근한다면 생산성이 올라가지 않을까하여 그룹웨어와 통신하는 웹페이지를 기획했다. ## 초기버전 프론트는 `Next.js로 Vercel로 배포`하였으며, 백엔드는 `Node.js`로 구성했다. 백엔드는 서버에 배포했는데, `AWS Lightsail + Ubuntu 환경에 nginx`를 붙였다. `SSH 셋팅`을 진행하고 `PM2`로 서비스를 관리했다. [( 참고 )](https://minhyeong-jang.github.io/2022/05/07/lightsail-server) 초기버전에서는 `출퇴근 기능과 법인카드 사용내역`을 포맷에 맞게 등록해주는 기능을 구현했다. 사이트에서는 항상 로그인 계정을 입력받고 그룹웨어와 통신하여 데이터를 가져온다. 출퇴근과 법인카드는 직원들이 `가장 많이 접근하는 메뉴`이기 때문에 채널에 오픈 당시 많은 환영을 받았다. ## 기능 업그레이드 5월 포괄임금제 정책이 변경되면서 출퇴근 기록이 중요해졌고, 유저에게 더 의미있는 정보를 제공해보았다. 다양한 `인사관리 프로그램을 참고`하여 어떤 정보를 제공하면 좋을까 고민하고 다음과 같이 UI를 변경했다. 메인화면에서는 `출퇴근 시간`을 UI로 명확하게...
2021년 09월 04일
학생정보와 과목 별 점수 데이터가 들어오는데, 해당 과목에서 최고 점수와 최소 점수를 제외하고 등급 순서로 나열한다. const grade = (arr) => { const average = arr.reduce((sum, currValue) => sum + currValue, 0) / arr.length; if (average >= 90) return "A"; if (average >= 80) return "B"; if (average >= 70) return "C"; if (average >= 50) return "D"; return "F"; }; function solution(scores) { const item = scores.map((_, arrIndex) => { let group = scores.map((_, numIndex) => scores[numIndex][arrIndex]); const personNum = group[arrIndex]; if ( personNum === Math.max.apply(null, group) || personNum === Math.min.apply(null, group) ) { group.filter((num) => num === personNum).length === 1 && group.splice(arrIndex, 1); } return grade(group); }); return item.join(""); }