백준 15657 JavaScript
수정하기
문서 생성 2022-04-15 11:54:51 최근 수정 2022-04-19 23:42:46
문제
풀이
백준 15652 문제와 유사하다. N
까지 숫자를 순회하는 대신 입력된 배열을 순회하는 것으로 변경해 푼다.
예제 입력 2를 살펴보자.
4 29 8 7 1
조건에 같은 수를 여러 번 골라도 된다고 했고 총 2
개 수를 선택하니까 첫 번째 수를 선택한 다음 배열에서 두 번째 수를 고를 땐 전체 수를 대상으로 하면 된다.
1을 먼저 고르면,1, 11, 71, 81, 9위와 같은 조합으로 고를 수 있다.
숫자 하나를 골랐을 때 숫자 전체를 다 탐색하니 DFS를 이용해 풀면 된다. 대신 M까지의 숫자만 출력 후 리턴해준다.
그리고 조건에 고른 수열은 "비내림차순(오름차순)이어야 한다"고 했으므로 처음에 입력받은 배열을 sort
메서드를 이용해 오름차순으로 정렬해준다.
const readFileSyncPath = require('path').basename(__filename).replace(/js$/, 'txt');// const readFileSyncPath = '/dev/stdin';const input = require('fs').readFileSync(readFileSyncPath).toString().trim().split("\n");// 자연수 N, Mconst [N, M] = input[0].split(" ").map(Number)// 입력받은 배열을 오름차순으로 정렬const num = input[1].split(" ").map(Number).sort((a, b) => a-b)const arr = []let answer = ''const dfs = (at, cnt) => {if (cnt === M) { // 뽑는 수 개수와 일치하면 출력for (let i = 0; i < M; i++) {answer += `${arr[i]} `}answer += `\n`return}// 배열의 수를 순회for (let i = at; i <= N; i++) {arr[cnt] = num[i-1]// 해당 숫자를 뽑은 뒤 재귀 함수를 실행한다. (다음에 뽑을 수를 순회 = 전체 수)dfs(at, cnt+1)at = at + 1 // 다음 수부터 뽑기 위해 1 증가}}dfs(1, 0)console.log(answer)