2022년 10월 25일
Level3 문제 이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다. 해결방법 임의의 한 구간을 선택해서 1s안에 몇 개의 타임라인이 지나가는지 구하는 문제이다. 임의라는게 가장 헷갈리는 부분인데, 단순하게 생각해보면 이미 종료시점에 맞춰서 데이터가 정렬되어서 내려온다. 즉, 데이터를 반복문 돌렸을 때 다음 데이터의 종료시점은 무조건 나보다 뒤에 있다. 그렇다면 시작 시간이 현재 데이터 구간 안에 다음 데이터가 포함되는 지를 확인하면 되고 그게 1s가 된다. 이게 설명을 하려니까 어려운데, 소스코드 내에서 설명하는 편이 편할 것 같다. 소스코드 시작, 종료, 작업시간을 구하는데 split으로 작성하기에는 코드가 길어져서 정규식으로 진행했다. 종료시간을 기준으로 반복문을 돌리며 그 다음 index의 데이터들의 시작시간을 확인한다. 이때, 포함해야하는 기준이 1000ms이기에 해당 값을 빼서 종료시간보다 이전이였는지 체크한다. 일치한다면 개수를 체크한다. 해당...
2022년 10월 25일
Level3 문제 2n명의 사원들을 두 팀으로 나누고 사원마다 무작위 자연수를 받았을 때, B팀이 승리하는 횟수 해결방법 큰 수가 이기는 규칙이기에 내림차순으로 정렬하는게 효율적이다. 게임으로 단순하게 생각하면 A팀의 가장 큰 숫자를 이기지 못하는 상황일 때, B팀의 가장 작은 숫자를 버리는 방향으로 진행하면 된다. ex) A팀 [11, 9, 8, 7], B팀 [10, 9, 8, 7]이라면 B팀에서 11을 이길 수 있는 카드가 없으니까 가장 작은 수를 버리면서 B팀의 가장 큰 수를 유지할 수 있다. 해당 방식으로 tail이라는 변수를 놓고 B팀이 뒤에서 카드를 몇장 버렸는 지 체크하면서 값을 비교한다. 소스코드 function solution(A, B) { const sortA = A.sort((a, b) => b - a); const sortB = B.sort((a, b) => b - a); let tail = 0; let count = 0; sortA.forEach((a, index) => { if (a >= sortB[index - tail]) { tail++; return; } count++; }); return count; } solution([6, 8, 7, 9], [7, 9, 8, 6]); solution([5, 1, 3, 7], [2, 2, 6,...
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]...
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(""); }
2021년 09월 04일
LV2 문제 function solution(n) { if (n < 3) return `${n || ""}`; if (!(n % 3)) return `${solution(Math.floor(n / 3) - 1)}4`; else return `${solution(Math.floor(n / 3))}${n % 3}`; }
2019년 06월 03일
문제 N개의 아파트가 일렬로 쭉 늘어서 있습니다. 이 중에서 일부 아파트 옥상에는 4g 기지국이 설치되어 있습니다. 기술이 발전해 5g 수요가 높아져 4g 기지국을 5g 기지국으로 바꾸려 합니다. 그런데 5g 기지국은 4g 기지국보다 전달 범위가 좁아, 4g 기지국을 5g 기지국으로 바꾸면 어떤 아파트에는 전파가 도달하지 않습니다. 예를 들어 11개의 아파트가 쭉 늘어서 있고, [4, 11] 번째 아파트 옥상에는 4g 기지국이 설치되어 있습니다. 만약 이 4g 기지국이 전파 도달 거리가 1인 5g 기지국으로 바뀔 경우 모든 아파트에 전파를 전달할 수 없습니다. (전파의 도달 거리가 W일 땐, 기지국이 설치된 아파트를 기준으로 전파를 양쪽으로 W만큼 전달할 수 있습니다.) 초기에, 1, 2, 6, 7, 8, 9번째 아파트에는 전파가 전달되지 않습니다. 1, 7, 9번째 아파트 옥상에 기지국을 설치할 경우, 모든 아파트에 전파를 전달할 수 있습니다. 3개의 아파트보다 더 많은 아파트 옥상에 기지국을 설치할 경우에도 모든 아파트에 전파를 전달할 수 있습니다. 이때, 우리는 기지국을 최소로 설치하면서 모든 아파트에 전파를 전달하려고 합니다. 해결방법 및 소스코드 처음에는 N개의 아파트를...
2019년 05월 29일
문제 xx 회사의 2xN명의 사원들은 N명씩 두 팀으로 나눠 숫자 게임을 하려고 합니다. 두 개의 팀을 각각 A팀과 B팀이라고 하겠습니다. 숫자 게임의 규칙은 다음과 같습니다. 먼저 모든 사원이 무작위로 자연수를 하나씩 부여받습니다. 각 사원은 딱 한 번씩 경기를 합니다. 각 경기당 A팀에서 한 사원이, B팀에서 한 사원이 나와 서로의 수를 공개합니다. 그때 숫자가 큰 쪽이 승리하게 되고, 승리한 사원이 속한 팀은 승점을 1점 얻게 됩니다. 만약 숫자가 같다면 누구도 승점을 얻지 않습니다. 전체 사원들은 우선 무작위로 자연수를 하나씩 부여받았습니다. 그다음 A팀은 빠르게 출전순서를 정했고 자신들의 출전 순서를 B팀에게 공개해버렸습니다. B팀은 그것을 보고 자신들의 최종 승점을 가장 높이는 방법으로 팀원들의 출전 순서를 정했습니다. 이때의 B팀이 얻는 승점을 구해주세요. A 팀원들이 부여받은 수가 출전 순서대로 나열되어있는 배열 A와 i번째 원소가 B팀의 i번 팀원이 부여받은 수를 의미하는 배열 B가 주어질 때, B 팀원들이 얻을 수 있는 최대 승점을 return 하도록 solution 함수를 완성해주세요. 제한사항 A와 B의 길이는 같습니다. A와 B의 길이는 1 이상...
2019년 05월 24일
Typescript? Typescript는 프로그래밍 언어로 Javascript + Type의 합성어이다. 컴파일 시 Javascript로 변환된다. Javascript가 유명한 건 엄격한 규칙이 없기 때문에 사용하기 쉽고, 우리가 원하는 방향으로 수정하기도 쉽다. 하지만 큰 프로젝트에서 일을 하거나 버그를 최소화하고 싶다면 위의 장점이 단점이 된다. Typescript로 작성하면 기능 예측이 가능하며, 코드를 읽기 쉬워지게 된다. 설치 yarn add typescript yarn add tsc-watch --dev yarn add crypto-js 참고 : yarn global add typescript 로 설치하는 경우, tsc-watch가 인식하지 못하는 오류가 있습니다. 설정 tsconfig.json Typescript => Javascript 변환할 떄 반영하는 설정 { "compilerOptions": { "module": "commonjs", "target": "ES2015", "sourceMap": true, "outDir": "dist" } } "module": "commonjs" node.js 평범하게 import, export 한다. "target": "ES2015" ES5 버전으로 컴파일 한다. "sourceMap": true Sourcemap을 설정한다. ( Sourcemap 이란? ) "outDir": "dist" dist 파일로 컴파일된 파일을 출력한다. "include": ["src/**/*"] 컴파일 과정에서 포함할 파일 ( src 폴더 내 전체 파일 ) "excude": ["node_modules"] 컴파일 과정에서 미포함 파일 tsc-watch 소스코드 수정 시 자동으로 컴파일을 진행한다. 기존 스크립트...
2019년 05월 22일
React Native & Expo 특징 React Native div, span 등 웹 태그 사용이 불가능하다. CSS 사용이 가능하다. ( 100% 동일하지는 않으며, Flexbox 사용이 가능 ) 리액트 네이티브가 지원하는 태그는 빌드 시 Android / iOS에 맞게 변환해준다. 오류를 엄격하게 체크한다. CSS shorthand property가 작동하지 않는다. Expo Android, IOS 테스트가 가능하다. 모바일에서 코드를 스캔하여 앱을 다운받고 실시간으로 수정사항 반영이 가능하다. ( Live Reload ) 배포 시 앱을 업데이트 하는 것이 아닌 서버에 코드를 업데이트하는 방식이다. 따라서 앱 스토어의 승인 절차가 필요없고, 유저는 서버에서 코드를 다운받는다. Online Coding : snack.expo.io 설치 Expo Learn npm install expo-cli --global expo init react-native-weather ? Choose a template: expo-template-blank ? Choose which workflow to use: managed ✔ Please enter a few initial configuration values. Read more: https://docs.expo.io/versions/latest/workflow/configuration · 100% completed ? Yarn v1.13.0 found. Use Yarn to install dependencies? Yes Expo 회원가입 및 로그인 expo 회원가입 expo login ? Username/Email Address: ? Password: [hidden] 실행 cd react-native-weather...
2019년 05월 19일
문제 게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다. U: 위쪽으로 한 칸 가기 D: 아래쪽으로 한 칸 가기 R: 오른쪽으로 한 칸 가기 L: 왼쪽으로 한 칸 가기 캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다. 이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다) 단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다. 명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요. 제한사항 dirs는 string형으로 주어지며, ‘U’, ‘D’, ‘R’, ‘L’ 이외에 문자는 주어지지 않습니다. dirs의 길이는 500 이하의 자연수입니다. 해결방법 처음 걸어본 길만 구한다는 것을 중점으로 개발하면 손쉽게 풀린다. 똑같은 길을 걷는 조건은...
2019년 05월 17일
문제 피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다. F(2) = F(0) + F(1) = 0 + 1 = 1 F(3) = F(1) + F(2) = 1 + 1 = 2 F(4) = F(2) + F(3) = 1 + 2 = 3 F(5) = F(3) + F(4) = 2 + 3 = 5 2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하시오. n은 1이상, 100000이하인 자연수입니다. 해결방법 피보나치 함수에서는 인자값으로 들어온 n만큼 재귀호출을 진행한다. F(n) = F(n-1) + F(n-2) 공식을 적용하여 i-1, i-2 를 더하는 공식이다. 재귀 호출방식은 속도가 너무 느리기 때문에 배열에 push하여 계산하는 방식으로 변경하였다. 이때, 조건의 1234567로 나눈 나머지라는 조건을 만족시키기 위해 %1234567을 수식에 넣는다. 소스코드 function fibonacci(num) { let arr = [0, 1]; for (let i = 2; i <= num; i++) { arr.push((arr[i - 1] + arr[i -...
2019년 05월 17일
문제 H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h가 이 과학자의 H-Index입니다. 어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요. 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다. 논문별 인용 횟수는 0회 이상 10,000회 이하입니다. citations : [3, 0, 6, 1, 5], return : 3 이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다. 해결방법 사실 문제를 더 이해하는데 오래걸렸다. h라는 값을 배열 내 데이터에서 찾고있었는데 아니였다. 단순 내림차순 후 반복문을 돌렸을 때 index와 해당 배열의 값을 비교하는 문제였다. 문제를 다시 설명하자면 h편의 논문은 h회 이상, 나머지는 h회 이하 인용이라는 부분은 index를 통하여...