[코딩테스트]백준 - N과 M(2)

Adela·2020년 6월 26일
0

백준온라인저지

목록 보기
10/53
post-thumbnail

N과 M(2)

문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

출력

  • 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다.
  • 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
  • 수열은 사전 순으로 증가하는 순서로 출력해야 한다.

예제 입력 1

3 1

예제 출력 1

1
2
3

예제 입력 2

4 2

예제 출력 2

1 2
1 3
1 4
2 3
2 4
3 4

예제 입력 3

4 4

예제 출력 3

1 2 3 4

출처

  • 문제를 만든 사람: baekjoon

해결한 코드

function b15650() {
    var fs = require('fs');
    var input = fs.readFileSync('/dev/stdin').toString().split(' ');
    // var input = fs.readFileSync(__dirname + '/stdin.txt').toString().replace(/\r/g, "").split(' ');
    var n = parseInt(input[0])
    var m = parseInt(input[1])
 
    var temp = new Array(n).fill(0)
    for (var i = 1; i <= n; i++) {
        temp[i - 1] = i
    }

    var ans = []

    for (var c = 0; c < temp.length; c++) {
        combination(ans, c, temp, temp[c].toString(), m)
    }
    
    print(ans)
}

function combination(ans, currentIndex, temp, str, m) {
    var newArr = temp.slice(currentIndex+1, temp.length)
 
    var array = str.split(' ')
    if(array.length == m){
        ans.push(str)
        return 
    }
    for(var i=0; i<newArr.length; i++){
        combination(ans, i, newArr, str+" "+newArr[i].toString(), m)
     
    }
}

function print(ans){
    for(var i=0; i<ans.length; i++){
        console.log(ans[i])
    }
}

b15650()

알고리즘

  • N과 M(1) 과 비슷하다. (약간 이어지는 내용 같달까...)

중복되는 수열을 여러 번 출력하면 안된다.

  1. 조합 함수 내에 필요한 변수는?
    👉🏻 조합을 시작할 원소의 인덱스(currentIndex), temp, 조합의 결과(str), 조합의 결과를 저장할 배열(ans), m
  2. 조합 함수 내에서 temp를 현재 원소 다음부터 temp끝까지로 자른다.
    var newArr = temp.slice(currentIndex+1, temp.length)
  3. N과 M(1) 문제에서처럼 str에 붙은 숫자의 갯수가 m과 같으면 ans에 저장한다.
  4. ans에 저장된 조합 결과값들을 출력한다.
profile
개발 공부하는 심리학도

0개의 댓글