목록전체 글 (245)
말랑한 하루
[ 학습 내용 ] filter() 내부에 Math연산을 추가하는 경우 상당한 메모리를 잡아먹는다. [ 소스 코드 ] function solution(n, edge) { let answer = 0; let load = new Array(n); let temp = n; while(temp-- > 0) { load[temp] = new Array(); } edge.forEach((edge) => { load[edge[0] -1].push(edge[1] -1); load[edge[1] -1].push(edge[0] -1); }); let queue = [{idx: 0, cnt: 0}]; let node = new Array(n).fill(2147483647); node[0] = 0; while(queue.len..
[ 학습 내용 ] Javascript에서 재귀함수의 매개변수에 array를 사용할 수 없었다. (해당 매개변수에 사용하는 Arrays.properties.push method가 존재하지 않음으로 에러표출) [ 소스 코드 ] function solution(tickets) { tickets.sort(); let answer = []; let path = ["ICN"]; let airport = new Array(tickets.length).fill(false); const travel = (start, cnt) => { if (answer.length) return; if (cnt === tickets.length) { answer = [...path]; return; } for(let i=0; i
[ 학습 내용 ] 최소치의 다리를 선택하면서 진행하되, 다리를 통해 연결되는 섬이 이미 연결되었는지를 판별해야한다. 처음 시도는, 단순하게 다리를 놓을 때 양 쪽 섬을 방문했었는지 판별했다. 그러나, 이는 서로 각각 연결된 두 그룹을 이을 때, 이미 모든섬이 방문했으므로 다리를 놓지 않아 마지막 연결에 실패한다. 다음 시도로, UnionFind를 활용하여 다리를 놓는 두 섬의 부모를 판단해 겹치는지 판단하는 것이다. 만약 겹친다면, 그 연결될 섬은 Cycle이 발생하고 겹치지 않는다면, 그 연결될 섬은 처음 연결되는 섬이므로 연결해준다. 여기서 그래프의 Cycle을 판단할 때, UnionFind가 가장 빠르고 편한방법인지 추후 확인하여 활용하려 한다. [ 소스 코드 ] function solution(n..
[ 개요 ] 그리디 [ 학습 내용 ] 그리디에서 가장 많이 본 유형의 문제가 아닌가 싶다. 여러구간이 존재하고, 그 구간이 겹치는 곳에 최소한의 무언가를 설치한다는 내용을 포함한 그리디 문제 이 문제를 해결하기 위해 다음의 경우를 항상 외워두도록 했다. 1) 구간에 대해 오름차순 할것 2) 첫 구간의 끝을 기억하고 배제한 뒤 시작할 것 3) 다음구간과 비교할 때 다음을 판단할 것 3-1) 내 기준끝점이, 현재 구간의 시작점보다 작은가? → 결과가 추가되어야 하며(현 문제에서는 카메라) 내 기준끝점을 현재구간의 끝점으로 변경한다 3-2) 내 기준끝점이, 현재 구간의 끝점보다 큰가? → 내 기준끝점을 현재구간의 끝점으로 변경한다 ※ 위 두 경우에 현재구간의 끝점으로 변경하는 이유는 다음구간과 비교하기 위해서..
[ 개요 ] 두개의 값을 비교하는 과정에서, 한측의 값이 고정되어 있으면 다른측에서는 모든 경우에 대해 대처할 수 있음을 가정으로 진행할 수 있다. 즉, A에 대해 B는 적재 적소에 원하는 값을 배치할 수 있는 이야기다. 결론적으로, B가 A에 대해 승리하기 위한 요소가 필요하므로 B와 A에 대해 오름, 내림차순하여 A의 순서에 따라 B의 MAX값을 비교하여 큰경우 B를 다음 수로 넘기며 진행하면 된다. [ 소스 코드 ] function solution(A, B) { let answer = 0; A.sort((o1, o2) => o2 - o1); B.sort((o1, o2) => o1 - o2); A.forEach((a) => { if (a < B.at(-1)) { answer++; B.pop(); } ..
[ 개요 ] 어느 숫자를 만들기 위한 요소들 중, 요소의 곱이 가장 큰 경우는 언제나 제곱근이다. ex) 16을 만들기 위한 숫자 중, 요소의 곱의 범위는 1*16 ~ 8*8 이 된다. [ 소스 코드 ] function solution(n, s) { let answer = []; let quotient = parseInt(s/n); let remainder = s%n; for(let i=0; i
[ 개요 ] 브루트포스 [ 소스 코드 ] function solution(begin, target, words) { const INT_MAX = 2147483647; let answer = INT_MAX; words.unshift(begin); let visit = new Array(words.length).fill(INT_MAX); if (!words.includes(target)) return 0; const checkWord = (o1, o2) => { return o1.filter((o, idx) => o != o2[idx]).length == 1 ? 1 : 0; } const changeWord = (prev, cnt) => { if (words[prev] === target) { answer ..
[ 학습 내용 ] 문제 내용을 이해하지 못해 풀이를 참조했던 문제이다. 첫 접근을 입출력 예#1만을 참조하여 아! 해당 작업량의 제곱근을 구해, 가장 가까운 큰 제곱근의 제곱값을 구하면 되는구나! 라고 생각하여 해멨다. 피로도는 제곱되므로 야근의 피로도를 최소로하기 위해선, 전체 작업을 하향평준화 해야한다. 작업량의 최대값을 Demi가 일할 수 있는 양만큼 1씩 빼주며 순환진행하면 전체적인 하향평준화가 된다. [ 소스 코드 ] function solution(n, works) { if (works.reduce((acc, cur) => acc + cur, 0) o2 - o1); while(n) { let max = works[0]; for(let i=0; i= max) { works[i]--; n--; }..