console.log에 한줄한줄 출력하면 시간초과.
result에 값을 더해서 출력하면 정답처리.
이것은 무슨 차이인지오
다름아닌 스택오버플로우 선생님께서 말씀해주신다.
https://stackoverflow.com/questions/2934509/exclude-debug-javascript-code-during-minification
console.log는 본디 디버깅용이기에, 변수를 따로 만들어 더해서 출력하는것보다 훨씬 느리다.
콜스택에 굉장히 무거운 게 쌓이나보구만.
나의 처참한 흔적들...
문제는 백트래킹으로 조합을 구한뒤, 완전탐색해서 계산하면 되는 거였다.
const devideTeam = (k) => {
if (k === N / 2) {
const team = arr.join("").trim().split("").map(Number);
compareTeam(team);
return;
}
for (let i = 0; i < N; i++) {
if (!visited[i]) {
arr[k] = i;
if (arr[k] < arr[k - 1]) continue;
visited[i] = 1;
devideTeam(k + 1);
visited[i] = 0;
}
}
};
나는 이런식으로 조합을 짜서 사용했었음. 오름차순으로 하면 조합이 보장되니까.
테스트케이스들은 다 통과햇는데, 스크린샷 처럼 런타임에러를 뿜었다.
하루쟁일 고생한 결과
const team = arr.join("").trim().split("").map(Number);
요놈이 문제였다.
특히 join("").split("")
이 문제였던듯...배열을 한 글자씩 자르지 않고, 공백 단위로 잘랐더니 맞았다고 나왔다.
그런데 아무리 돌려봐도, 값이 똑같이 나오는데...무슨차이일까?
아무튼 다음부턴 백트래킹에서 join
을 사용할땐 공백단위로 붙여야겠음!
아니면 코드 개선의 여지도 있고.
요 문제에서 사용했던 기법이다.
백트래킹을 돌려서, 25개의 자리중 다솜이4명 이상 포함 된 7개의 조합을 얻으려고 했음.
짜다보니 백트래킹은 1차원 배열에서 할때 진가를 발휘한다. 고민고민...
잘 생각해보니 2차원배열은 1차원 배열로 표현해도 무리가 없다.
가령 5x5의 2차원 배열은 길이 25의 1차원 배열로 표현됨.
인덱스는 x = Math.floor(i/5)
, y = i%5
요렇게 표현할수 있다!
그리고 평탄화 할땐 [].concat(...arr)
요런식으로 평탄화 깰끔스하게 가능.
빈 배열에 스프레드 문법으로 펼쳐넣는 형식이다.
지금까지 배운 것중 재귀 + 백트래킹이 가장 난해한듯 싶다. 귀납적으로 사고하고, 컴퓨터에게 연산을 맡겨야한다,
그래프를 그리며 생각하니 재귀나 백트래킹의 작동을 이해할 수 있다만, 로직이 복잡해지니 조금 버거운것 같다.
재귀와 백트래킹의 작동 과정을 잘 따라가야 더 성장할 수 있을듯!