-
문제
https://www.acmicpc.net/problem/15649
15649번: N과 M (1)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
How to Solve ?
[1] 왜 백트래킹을 사용하는가?
둘의 차이를 한 마디로 정리하라면, 불 필요한 방문을 줄이는 것인데요 ! N과 M 문제에서 우리에게 원하는건 "중복 되는 수열" 이 존재 하지 않는 것 입니다.
즉, [1,1] [2,2] [3,3] 와 같은 수열의 출력을 막아야 하는데 이것이 우리가 이 문제에 백트래킹을 적용 해야 하는 이유입니다.
[2] 어떻게 막는데?
1을 기준으로 dfs를 하게 될 때, 이를 방문 처리함으로써 ! [1,2,1] 과 같은 수가 나올 수 없도록 막고 자신의 순서가 끝나면 방문을 해제하는 식으로 구현 하였습니다.
function dfs(cnt) { if (cnt === M) { result += `${output.join(" ")}\n`; return; } for (let i = 1; i <= N; i++) { if (visited[i] === 1) continue; visited[i] = 1; output.push(i); dfs(cnt + 1); output.pop(); // 1 -> 2 -> 3 -> 4 visited[i] = 0; } } let result = ""; const [N, M] = [4, 3]; const visited = Array(N + 1).fill(0); const output = []; dfs(0); console.log(result.trim());
'PS > 백준' 카테고리의 다른 글
[백준_1969] DNA ( 그리디 - 자바스크립트 ) (0) 2021.06.12 [백준_1343] 폴리오미노 ( 그리디 - 자바스크립트 ) (0) 2021.06.11 [백준_14889] 스타트와 링크 ( 백트래킹 - 자바스크립트 ) (0) 2021.06.10 [백준_1911] 흙길 보수하기 ( Greedy - 자바스크립트 ) (0) 2021.06.10 [백준_1182] 부분 수열의 합 ( dfs - 자바스크립트 ) (0) 2021.06.09 댓글