[BOJ][⚪2][백준#15665] N과 M (11)
작성:    
업데이트:
카테고리: BOJ Silver II
태그: BOJ, BOJ Silver, PS, Python
문제 출처
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
N개의 자연수 중에서 M개를 고른 수열 같은 수를 여러 번 골라도 된다.
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 7) 둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.
예제
예제 1
입력
3 1
4 4 2
출력
2
4
예제 2
입력
4 2
9 7 9 1
출력
1 1
1 7
1 9
7 1
7 7
7 9
9 1
9 7
9 9
예제 3
입력
4 4
1 1 2 2
출력
1 1 1 1
1 1 1 2
1 1 2 1
1 1 2 2
1 2 1 1
1 2 1 2
1 2 2 1
1 2 2 2
2 1 1 1
2 1 1 2
2 1 2 1
2 1 2 2
2 2 1 1
2 2 1 2
2 2 2 1
2 2 2 2
My Sol
N, M = map(int, input().split())
nums = sorted(list(map(int, input().split())))
def f():
if len(stack) == M:
print(*stack)
return
check = 0
for k in range(N):
if check != nums[k]:
check = nums[k]
stack.append(nums[k])
f()
stack.pop()
stack = []
f()
역시 sort된 nums 배열에서 nums[k]가 이전 k의 nums 값인 nums[k-1]인 경우 해당 k는 넘어가야 하므로 check를 이용해 체크하는 방식이다. 오히려 수 자체의 중복은 허용하기 때문에 visited를 도입하지 않아도 돼서 한결 편하게 풀 수 있는 문제였다.
check는 사실상 동일 depth에서 이전 nums[k]의 값이다. 그런데 다음 k에서 check와 nums[k]가 같다는 것은 해당 k는 패스하고 넘어가야 하기 때문에 if문에서 이를 걸러 그 다음 k로 넘겨주는 것이다.
nums에서 동일한 값이 아닌 때의 k가 나오면 for 반복문 내에서 check를 nums[k]로 재정의해주고 stack에 nums[k]를 추가하고 재귀 호출 후 원상태로 되돌리는 것이다.
결과
맞았습니다!!
댓글남기기