본문 바로가기

Web development/Algorithm64

[프로그래머스] 기능개발 (javascript) 풀어보러 가기 : https://programmers.co.kr/learn/courses/30/lessons/42586 완성까지 남은 기간을 담은 배열을 만들고(remains) remains의 반복을 돌면서 앞의 수보다 큰 수가 나오면 세트로 배포되고, 앞의 수보다 작은 수가 나오면 새로운 배포가 된다. [5, 10, 1, 1, 20, 1]=> 5, 10 / 1, 1, 20 / 1 => [2, 2, 1] 이렇게 되어야 하므로 remains[0] = 5 첫 기능은 무조건 먼저 배포되므로 초기값으로 1 추가 answer = [1]; remains[1] = 10 remains[0] < remains[1]이므로 함께 배포됨. answer[마지막요소]++; answer = [2]; remains[2] = 1 re.. 2021. 8. 20.
[프로그래머스] 상호 평가 (javascript) 상호평가 방식으로 점수를 매기는데 자기 자신에게 준 점수가 받은 점수 중 유일한 최고점/최저점이면 제외하고 평균을 계산한다. 학생별로 받은 점수를 쉽게 계산할 수 있도록 배열을 뒤집는다. (뭐.. i번 학생의 점수를 score[0~n][i]로 해도 되긴 하지만..) 그리고 1) 점수가 제외되지 않는 경우 그냥 총합/인원수를 구하면 된다. 2) 점수가 제외되는 경우 (총합-내가 준 점수)/인원수-1 하면 된다. function solution(scores) { var answer = ''; const s = []; // 학생별 점수가 될 수 있도록 배열 뒤집기 for(let i in scores){ for(let j in scores[i]){ if(!s[j]) s.push([]) s[j].push(scor.. 2021. 8. 20.
[프로그래머스] 부족한 금액 계산하기 (javascript) 탈때마다 첫 이용료의 n배가 되는 놀이기구를 count번 탔을 때 얼마가 모자라는지 리턴하는 문제 가우스 공식을 이용하면 된다. 주의할 점은 돈이 충분하다면 0을 리턴해야 한다. function solution(price, money, count) { // price *1 + price *2 + ... price*count // price(1+2+3+...count) // count *(count + 1)/2 * count const budget = count*(count+1)/2 * price; return budget>money ? budget - money : 0; } 풀어보러 가기 : https://programmers.co.kr/learn/courses/30/lessons/82612 2021. 8. 20.
[LeetCode] 55. Jump Game (javascript) 주어진 배열이 있다. 인덱스 0에서 시작하는데, 요소의 숫자만큼 점프를 할 수 있다.(더 짧게 뛰어도 된다.) 이때, 배열의 끝까지 갈 수 있는지 검사하는 문제이다. Input: nums = [2,3,1,1,4] Output: true nums[0]=2에서 두칸, nums[2]=1에서 한칸, nums[3]=1에서 한칸 가면 도착한다. nums[0]=2에서 한칸, nums[1]=3에서 세칸 가면 도착한다. Input: nums = [3,2,1,0,4] Output: false nums[0]=3에서 세칸을 가도, nums[1]=2에서 두칸을 가도, nums[2]=1에서 한칸을 가도 마지막 요소에 도달할 수 없다. 그러므로 false이다. 이 문제를 접했을 때... DFS로 풀어야 하나? 아니면 브루트포스??.. 2021. 8. 20.
[프로그래머스] N으로 표현 주어진 N을 최대한 적게 사용하여 사칙연산(+, -, *, /)으로 목표하는 number를 만들고, 최소 몇개가 필요한지 구하는 문제이다. 유의할 점은 N=5인 경우 두 개를 사용하면 55로도 만들 수 있지만, 그렇다고 N=5 number=105일때 (5 + 5) = 10 10 + "5" = 105 이렇게는 할 수 없다는 점이다. 이미 사칙연산된 숫자에는 N을 붙일 수 없고, 사칙연산할 원소로만 사용해야 한다. function solution(N, number) { var answer = 0; if(N == number) return 1; // 5 // 55 5+5 5-5 5/5 5*5 // [55 0 10 1 25] // 55 + 사칙연산 // 555, [55 0 10 1 25]* 사칙연산 // 주어진.. 2021. 8. 12.
[프로그래머스] 해시/위장 옷장에서 옷을 꺼내 입되 같은 부위에는 하나의 옷만 입을 수 있다. 빨간 티셔츠, 파란 티셔츠, 검은 모자 => [빨간 티셔츠만, 파란 티셔츠만, 검은 모자만, 빨간 티셔츠와 검은 모자, 파란 티셔츠와 검은 모자] 옷장 안에서 부위별로 옷을 분류한 후, => 모자: 3개, 티셔츠: 2개 ... 한 부위만 입는 경우 => 모자만, 티셔츠만, ... 두 부위만 입는 경우, => 모자와 티셔츠, 모자와 신발, 티셔츠와 신발 ... ... 로 조합으로 경우의 수를 구하면 된다. function solution(clothes) { const count = clothes.length; if(count < 1) return 0; const closet = {}; for(let c of clothes) { if(clo.. 2021. 8. 12.
[LeetCode] 198. House Robber (javascript) 도둑이 도둑질을 하는데 이웃한 두 집을 연속으로 털면 경찰에 잡힌다. 연속으로 털지 않으면서 가장 많은 돈을 털 수 있도록 하는 문제이다. /** * @param {number[]} nums * @return {number} */ var rob = function(nums) { let prev = 0; let cur = 0; let temp; for(let i of nums) { temp = cur; // temp = 0 // temp = 1 // temp = 2 // temp = 4 cur = Math.max(i+prev, cur); // cur = Math.max(1 + 0, 0) // cur = max(2+0, 1)// cur = max(3+1,2) prev = temp;// prev = 0 // .. 2021. 8. 12.
[LeetCode] 118. Pascal's Triangle (javascript) 피보나치와 살짝 유사한 문제이다. 각 배열의 처음과 끝에 1을 넣어주고, 더한 값들을 추가해주면 되는 간단한 문제이다. /** * @param {number} numRows * @return {number[][]} */ var generate = function(numRows) { if(numRows == 1) return [[1]]; if(numRows==2) return [[1], [1, 1]]; let result = [[1], [1,1]]; for(let i = 2; i < numRows; i++){ const arr = [1]; const prev = result[i-1]; const len = prev.length; for(let j = 0; j 2021. 8. 12.
[프로그래머스] 뉴스 클러스터링 (javascript) 주어진 두개의 문자열에 대해 자카드 유사도를 리턴하는 문제이다. 자카드 유사도란 문자열을 2개씩 나누어 쪼개고 france => fr, ra, an, nc, ce, french => fr, re, en, nc, ch 합집합과 교집합의 원소 갯수를 구해 나눈 것이다. insersection => {fr, nc} union => {fr, ra, an, nc, ce, re, en, ch} 2/8 = 0.25 유의할 점이 있는데 1. 여기서 합집합과 교집합을 구할 때, 중복을 허용하는 집합이라는 점에 유의해야 한다. 예를들어 aaaa, aaa가 주어졌다면 => [aa, aa, aa] [aa, aa] 중복을 허용하지 않는다면 교집합은 [aa]가 되겠지만, 이 문제의 경우 중복을 허용하기 때문에 [aa, aa]가 .. 2021. 8. 12.