첫 번째 풀이 가장 많이 꼬인 전깃줄을 차례로 제거하면서 꼬인 줄이 없을 때 까지 반복한다. let fs = require('fs'); let input = fs.readFileSync('/dev/stdin').toString().trim().split("\\n") const N = +input.shift() let data = input.map(v => v.split(" ").map(Number)) let countArr = Array.from({length:N},(v,i)=>[i,[],0]) for(let i=0; i end2)){ countArr[i][1].push(j) countArr[i][2]++ } } } } let answer = 0; while(true){ const deleteIndex ..
첫 번째 풀이 단순하게 DFS로 풀었다. 이 문제의 경우 DFS로만 풀게되면 시간초과가 나게 되어있다. 시간초과가 나지 않게하기 위해 never라는 배열을 만들어 절대 가지 못하는 길을 체크했다. 그래도 여전히 시간초과가 남. 갈 수 있는 길을 방문 했을 경우 멈추는 것이 아니라 끝까지 방문하는 알고리즘이여서 그런 듯. let fs = require('fs'); let input = fs.readFileSync('/dev/stdin').toString().trim().split("\\n") const [M,N] = input.shift().split(" ").map(Number) const data = input.map(v => v.split(" ").map(Number)) const arr = Arra..
1. 첫 번째 시도 처음 문제를 봤을 때 들었던 생각은 재귀를 이용한 완전탐색. const fs = require('fs'); const Data = fs.readFileSync('/dev/stdin').trim() .split("\\n").map(v => v.split(" ").map(Number)); const [N,K] = Data.shift() Data.sort((a,b)=>b[1] - a[1]) let answer = 0; function additem(bag,index,w,v) { if(index === N){ if(answer < v){ answer = v } return } const newbag = [...bag] additem([...newbag],index+1,w,v) const [W..
이 문제는 위의 이미지를 참고하면 이해하기가 쉽다. 알파벳이 같다면 대각선 왼쪽의 값에서 +1, 같지 않다면 위쪽, 왼쪽에서 큰 수를 가져온다. let fs = require('fs'); let input = fs.readFileSync('/dev/stdin').toString().trim().split("\\n") const A = input[0].split("") const B = input[1].split("") const DP = Array.from({length:B.length+1}, ()=>Array(A.length+1).fill(0)) let answer = 0; for(let i=0; i
첫번째 시도 시작시간을 기준으로 정렬을 한 다음, 늦은시간, 즉 뒤에서 부터 순회를 돌면서, 각각의 시간 뒤에 올 수 있는 시간표의 갯수를 나타내는 arr 배열을 만듦. const Data = `4 0 1 1 5 2 3 4 5` .trim() .split("\n").map(v => v.split(" ").map(Number)); const arr = Array(...Data.shift()).fill(1) Data.sort((a, b) => a[0] - b[0]); for (let i = arr.length - 1; i >= 0; i--) { for (let j = i+1; j < arr.length; j++) { if (Data[i][1] v.split(" ").map(Number)); Data.shif..